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 |