Java中I/O系统处理流的使用
## 一、处理流概述
在Java的I/O系统中,处理流(也称为过滤流)是一种对基本的字节流或字符流进行功能增强的流。处理流本身并不直接连接到数据源或数据汇(如文件、网络连接等),而是包裹在其他的节点流(直接与数据源或数据汇交互的流)之上,从而为节点流添加额外的功能,例如缓冲、转换编码、数据处理等功能。
## 二、常见的处理流及使用示例
### (一)缓冲流(BufferedInputStream和BufferedOutputStream、BufferedReader和BufferedWriter)
1. **缓冲字节流**
- **BufferedInputStream**
- 作用:为输入字节流提供缓冲功能。它内部有一个缓冲区,减少了从底层数据源(如文件或网络连接)读取数据的次数,从而提高了读取效率。
- 示例:
```java
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class BufferedInputStreamExample {
public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream("test.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
int data;
while ((data = bis.read())!= -1) {
System.out.print((char) data);
}
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
- **BufferedOutputStream**
- 作用:为输出字节流提供缓冲功能。数据先写入缓冲区,当缓冲区满或者手动刷新时,才将数据写入底层的输出流。
- 示例:
```java
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class BufferedOutputStreamExample {
public static void main(String[] args) {
try {
FileOutputStream fos = new FileOutputStream("output.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
String data = "Hello, World!";
byte[] bytes = data.getBytes();
bos.write(bytes);
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
2. **缓冲字符流**
- **BufferedReader**
- 作用:为字符输入流提供缓冲功能,并且提供了方便的`readLine`方法,可以按行读取字符数据。
- 示例:
```java
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class BufferedReaderExample {
public static void main(String[] args) {
try {
FileReader fr = new FileReader("test.txt");
BufferedReader br = new BufferedReader(fr);
String line;
while ((line = br.readLine())!= null) {
System.out.println(line);
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
- **BufferedWriter**
- 作用:为字符输出流提供缓冲功能,并且提供了`newLine`方法,可以方便地写入换行符。
- 示例:
```java
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedWriterExample {
public static void main(String[] args) {
try {
FileWriter fw = new FileWriter("output.txt");
BufferedWriter bw = new BufferedWriter(fw);
bw.write("This is a test");
bw.newLine();
bw.write("Another line");
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
### (二)转换流(InputStreamReader和OutputStreamWriter)
1. **InputStreamReader**
- 作用:将字节流转换为字符流。它使用指定的字符编码将字节输入流中的字节解码为字符。
- 示例:假设我们有一个UTF - 8编码的文件,我们可以使用`InputStreamReader`来正确地读取其中的字符内容。
```java
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class InputStreamReaderExample {
public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream("test_utf8.txt");
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
int data;
while ((data = isr.read())!= -1) {
System.out.print((char) data);
}
isr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
2. **OutputStreamWriter**
- 作用:将字符流转换为字节流。它使用指定的字符编码将字符转换为字节,然后写入字节输出流。
- 示例:
```java
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class OutputStreamWriterExample {
public static void main(String[] args) {
try {
FileOutputStream fos = new FileOutputStream("output_utf8.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
String data = "这是一段测试文字";
osw.write(data);
osw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
### (三)数据输入输出流(DataInputStream和DataOutputStream)
1. **DataInputStream**
- 作用:允许应用程序以与机器无关的方式从底层输入流中读取基本的Java数据类型(如`int`、`double`、`boolean`等)。
- 示例:
```java
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class DataInputStreamExample {
public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream("data.bin");
DataInputStream dis = new DataInputStream(fis);
int num = dis.readInt();
double d = dis.readDouble();
boolean b = dis.readBoolean();
System.out.println("Int: " + num + ", Double: " + d+ ", Boolean: " + b);
dis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
- 在这个示例中,假设`data.bin`文件中已经按照`int`、`double`、`boolean`的顺序写入了相应类型的数据。
2. **DataOutputStream**
- 作用:允许应用程序以与机器无关的方式将基本的Java数据类型写入到底层输出流中。
- 示例:
```java
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class DataOutputStreamExample {
public static void main(String[] args) {
try {
FileOutputStream fos = new FileOutputStream("data.bin");
DataOutputStream dos = new DataOutputStream(fos);
dos.writeInt(10);
dos.writeDouble(3.14);
dos.writeBoolean(true);
dos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
## 三、总结
处理流在Java I/O系统中起着非常重要的作用。它们通过包裹节点流,为基本的I/O操作提供了诸如缓冲、编码转换、数据类型处理等丰富的功能。合理地使用处理流可以提高I/O操作的效率、方便数据的处理以及确保数据的正确读写。在实际开发中,根据具体的需求选择合适的处理流组合是非常关键的。