Java 中的 IO 流的分类?说出几个你熟悉的实现类?
参考回答
Java 中的 IO 流分类:
- 按流的方向分类
- 输入流(InputStream/Reader):用于从外部读取数据到程序中。
- 输出流(OutputStream/Writer):用于将数据从程序中写出到外部。
- 按处理数据的单位分类
- 字节流(InputStream/OutputStream):以字节(8 位)为单位处理数据,适合处理图片、视频、音频等二进制文件。
- 字符流(Reader/Writer):以字符(16 位)为单位处理数据,适合处理文本文件。
- 按功能分类
- 节点流:直接操作数据源或目的地,例如文件、内存、网络等。
- 处理流:对已有流进行功能增强或数据处理,例如缓冲、转换、压缩等。
常见的实现类:
- 字节流
- 输入流:
FileInputStream
、BufferedInputStream
- 输出流:
FileOutputStream
、BufferedOutputStream
- 输入流:
- 字符流
- 输入流:
FileReader
、BufferedReader
- 输出流:
FileWriter
、BufferedWriter
- 输入流:
- 特殊流
- 对象流:
ObjectInputStream
、ObjectOutputStream
- 数据流:
DataInputStream
、DataOutputStream
- 转换流:
InputStreamReader
、OutputStreamWriter
- 对象流:
详细讲解与拓展
1. IO 流的四大核心基类
- 字节流:
InputStream
:所有字节输入流的超类。OutputStream
:所有字节输出流的超类。
- 字符流:
Reader
:所有字符输入流的超类。Writer
:所有字符输出流的超类。
关系图:
InputStream ────> FileInputStream, BufferedInputStream, ObjectInputStream
OutputStream ────> FileOutputStream, BufferedOutputStream, ObjectOutputStream
Reader ────> FileReader, BufferedReader, InputStreamReader
Writer ────> FileWriter, BufferedWriter, OutputStreamWriter
2. 字节流的实现类
字节流适合处理 二进制数据,如图片、视频、音频等。
FileInputStream
和FileOutputStream
:- 用于从文件中读取或向文件中写入字节数据。
-
示例:
import java.io.*; public class ByteStreamExample { public static void main(String[] args) { try (FileInputStream fis = new FileInputStream("input.txt"); FileOutputStream fos = new FileOutputStream("output.txt")) { int data; while ((data = fis.read()) != -1) { fos.write(data); // 将读取的数据写入另一个文件 } } catch (IOException e) { e.printStackTrace(); } } }
-
BufferedInputStream
和BufferedOutputStream
:- 对字节流提供缓冲功能,提高 IO 操作效率。
-
示例:
import java.io.*; public class BufferedByteStreamExample { public static void main(String[] args) { try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("input.txt")); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("output.txt"))) { int data; while ((data = bis.read()) != -1) { bos.write(data); } } catch (IOException e) { e.printStackTrace(); } } }
3. 字符流的实现类
字符流适合处理 文本数据,如 .txt
文件。
FileReader
和FileWriter
:- 用于从文件中读取或向文件中写入字符数据。
-
示例:
import java.io.*; public class CharStreamExample { public static void main(String[] args) { try (FileReader fr = new FileReader("input.txt"); FileWriter fw = new FileWriter("output.txt")) { int data; while ((data = fr.read()) != -1) { fw.write(data); // 将字符写入另一个文件 } } catch (IOException e) { e.printStackTrace(); } } }
-
BufferedReader
和BufferedWriter
:- 对字符流提供缓冲功能,并支持按行读写。
-
示例:
import java.io.*; public class BufferedCharStreamExample { public static void main(String[] args) { try (BufferedReader br = new BufferedReader(new FileReader("input.txt")); BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) { String line; while ((line = br.readLine()) != null) { bw.write(line); bw.newLine(); // 写入换行符 } } catch (IOException e) { e.printStackTrace(); } } }
4. 特殊流的实现类
-
ObjectInputStream
和ObjectOutputStream
:- 用于序列化和反序列化对象。
-
示例:
import java.io.*; class Person implements Serializable { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Person{name='" + name + "', age=" + age + "}"; } } public class ObjectStreamExample { public static void main(String[] args) { try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.dat")); ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.dat"))) { // 序列化对象 oos.writeObject(new Person("Alice", 30)); // 反序列化对象 Person person = (Person) ois.readObject(); System.out.println(person); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } }
-
InputStreamReader
和OutputStreamWriter
:-
用于字节流与字符流之间的转换。
-
示例:
import java.io.*; public class StreamReaderWriterExample { public static void main(String[] args) { try (InputStreamReader isr = new InputStreamReader(new FileInputStream("input.txt"), "UTF-8"); OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("output.txt"), "UTF-8")) { int data; while ((data = isr.read()) != -1) { osw.write(data); } } catch (IOException e) { e.printStackTrace(); } } }
-
总结
分类总览
分类方式 | 类型 | 代表基类 | 常见实现类 |
---|---|---|---|
流方向 | 输入流 | InputStream |
FileInputStream ,BufferedInputStream |
输出流 | OutputStream |
FileOutputStream ,BufferedOutputStream |
|
输入流 | Reader |
FileReader ,BufferedReader |
|
输出流 | Writer |
FileWriter ,BufferedWriter |
|
处理单位 | 字节流 | InputStream /OutputStream |
FileInputStream ,FileOutputStream |
字符流 | Reader /Writer |
FileReader ,FileWriter |
|
功能 | 节点流 | – | FileInputStream ,FileReader |
处理流 | – | BufferedInputStream ,BufferedReader |