java I/O流 你了解吗?

目录

1. 字节流(InputStream 和 OutputStream)

1.1 InputStream(字节输入流)

1.2 OutputStream(字节输出流)

2. 字符流(Reader 和 Writer)

2.1 Reader(字符输入流)

2.2 Writer(字符输出流)

3. 缓冲流(BufferedInputStream / BufferedOutputStream / BufferedReader / BufferedWriter)

4. 转换流(InputStreamReader 和 OutputStreamWriter)

5. 数据流(DataInputStream 和 DataOutputStream) 

6. 对象流(ObjectInputStream 和 ObjectOutputStream)

 

总结

1. 字节流(InputStream 和 OutputStream)

字节流用于处理所有类型的数据,因为它是按字节操作的。这种流特别适合处理图片、音频等二进制文件。就像传送带可以一箱一箱地搬运货物,字节流则是以“字节”为单位来搬运数据。

1.1 InputStream(字节输入流)

InputStream 的作用是读取字节数据,比如从文件、网络中获取数据。它把数据流读入内存,就像水流进池塘一样。

常用类和用途:

  • FileInputStream:用于读取文件的字节。比如打开一张图片文件,就可以用 FileInputStream
  • BufferedInputStream:在原有流的基础上增加了缓冲区,就像用水桶而不是小杯子装水,效率更高。

简单示例:读取文件的字节数据

 

java

复制代码

FileInputStream fileInput = new FileInputStream("example.jpg"); int byteData; while ((byteData = fileInput.read()) != -1) { System.out.print(byteData + " "); // 打印字节数据 } fileInput.close();

1.2 OutputStream(字节输出流)

OutputStream 的作用是写入字节数据,比如把数据存到文件或网络中。它的工作类似一个水龙头,把数据流输出到指定的地方。

常用类和用途:

  • FileOutputStream:用于将数据写入文件。
  • BufferedOutputStream:同样提供缓冲区提高效率,可以在写大文件时显著提升速度。

简单示例:写入文件

 

java

复制代码

FileOutputStream fileOutput = new FileOutputStream("output.txt"); fileOutput.write(65); // 写入字节'A',ASCII 码是 65 fileOutput.close();


2. 字符流(Reader 和 Writer)

字符流以字符为单位处理数据,更适合处理文本数据。可以将字符流理解为“翻译器”,它能将数据解读成字符,方便我们处理中文、英文等字符内容。

2.1 Reader(字符输入流)

Reader 用于读取字符数据,比如从文件中读取文本内容,就像我们在读一本书,看到的是文字而非单独的字母或符号。

常用类和用途:

  • FileReader:用于读取文件中的字符数据。可以用来打开 .txt 文件。
  • BufferedReader:可以按行读取文本,效率高且方便处理每一行数据。

简单示例:按行读取文件

 

java

复制代码

BufferedReader reader = new BufferedReader(new FileReader("example.txt")); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } reader.close();

2.2 Writer(字符输出流)

Writer 用于写入字符数据,比如把文字写入文件。就像我们写一封信,可以将字符数据逐个写入到文件中。

常用类和用途:

  • FileWriter:用于将字符数据写入文件。可以用来写 .txt 文件。
  • BufferedWriter:增加了缓冲区,写入数据更快,常用于大文本的输出。

简单示例:写入字符到文件

 

java

复制代码

BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt")); writer.write("Hello, World!"); writer.newLine(); // 写入换行符 writer.write("Java IO 流学习!"); writer.close();


3. 缓冲流(BufferedInputStream / BufferedOutputStream / BufferedReader / BufferedWriter)

缓冲流是一种特殊的流,主要目的是提高读写速度。它的工作方式类似于快递公司的集运仓库,把很多件货物一起运输,减少单件运输的成本。

  • BufferedInputStream / BufferedOutputStream:这些流主要作用于字节流,在大量数据读写时提高效率。
  • BufferedReader / BufferedWriter:主要作用于字符流,适合文本数据的按行读写,简化操作。

简单示例BufferedReader 读取文件的同时提高速度

 

java

复制代码

BufferedReader reader = new BufferedReader(new FileReader("example.txt")); String line; while ((line = reader.readLine()) != null) { System.out.println(line); // 读取每一行内容 } reader.close();


4. 转换流(InputStreamReader 和 OutputStreamWriter)

转换流用于在字节流和字符流之间进行转换,尤其是处理不同编码时很有用。它的功能类似于语言翻译器,可以在不同编码的字节和字符之间进行转换。

  • InputStreamReader:将字节输入流转换为字符输入流。可以指定编码格式,比如将 UTF-8 字节解读成字符。
  • OutputStreamWriter:将字符输出流转换为字节输出流,方便输出不同编码的数据。

简单示例:用指定编码读取文件

 

java

复制代码

InputStreamReader reader = new InputStreamReader(new FileInputStream("example.txt"), "UTF-8"); int data; while ((data = reader.read()) != -1) { System.out.print((char) data); // 读取字符 } reader.close();


5. 数据流(DataInputStream 和 DataOutputStream)

数据流用于读写 Java 的基本数据类型,类似于打包好的数据传输方案,允许直接写入和读取 int、double、boolean 等数据类型。就像可以直接发送 “数字 42” 而不是一个个字符去拼凑“42”。

  • DataInputStream:允许从流中读取 int、float 等基本数据类型。
  • DataOutputStream:允许写入 int、float 等数据类型,常用于序列化文件。

简单示例:写入基本数据类型到文件

 

java

复制代码

DataOutputStream out = new DataOutputStream(new FileOutputStream("data.bin")); out.writeInt(42); // 写入一个整数 out.writeDouble(3.14159); // 写入一个浮点数 out.close();


6. 对象流(ObjectInputStream 和 ObjectOutputStream)

对象流用于读写 Java 对象,前提是对象必须实现 Serializable 接口。这就像寄快递时打包了一个完整的包裹,而不仅仅是某个属性或数据片段。

  • ObjectInputStream:从流中读取对象,反序列化成内存中的对象。
  • ObjectOutputStream:将对象写入流中,序列化到文件。

简单示例:序列化和反序列化一个对象

 

java

复制代码

// 写入对象 ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("object.dat")); out.writeObject(new Person("Alice", 30)); // 假设 Person 类实现 Serializable out.close(); // 读取对象 ObjectInputStream in = new ObjectInputStream(new FileInputStream("object.dat")); Person person = (Person) in.readObject(); System.out.println("Name: " + person.getName() + ", Age: " + person.getAge()); in.close();


总结

Java IO 流的设计使得不同类型数据的读写操作既灵活又高效,可以满足不同需求:从简单的文本文件处理到复杂的对象序列化。根据文件内容和读写需求选择合适的流类型,有助于简化代码并提升性能。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值