IO转换流(InputStreamReader 和 OutputStreamWriter)是Java中用于实现字符流与字节流之间的桥梁,提供了字符流和字节流之间的转换功能。
在处理文本数据时,字符流更为方便,而字节流则适合处理二进制数据。但是,有些情况下,我们可能需要将字节流转换为字符流或将字符流转换为字节流。这时就可以使用IO转换流。
IO转换流通过将输入的字节流转换成字符流,或将输出的字符流转换成字节流,以实现字符和字节之间的相互转换。
- InputStreamReader:将字节输入流转换为字符输入流。它继承自 Reader 类,可以指定字符集编码来进行解码,将字节流解析成字符流。
- OutputStreamWriter:将字符输出流转换为字节输出流。它继承自 Writer 类,可以指定字符集编码来进行编码,将字符流转换成字节流。
使用IO转换流的好处是可以灵活地处理文本数据,通过提供不同的字符集编码参数,可以处理多种编码格式的数据。比如,可以从一个UTF-8编码的字节流中读取数据,并将其转换为GBK编码的字符流,或者反过来。
import java.io.*;
public class Example {
public static void main(String[] args) {
try {
// 字节流转字符流(解码)
InputStream inputStream = new FileInputStream("input.txt");
Reader reader = new InputStreamReader(inputStream, "UTF-8");
// 读取数据
int data;
while ((data = reader.read()) != -1) {
char ch = (char) data;
System.out.print(ch);
}
// 字符流转字节流(编码)
OutputStream outputStream = new FileOutputStream("output.txt");
Writer writer = new OutputStreamWriter(outputStream, "UTF-8");
// 写入数据
writer.write("Hello, World!");
// 刷新缓冲区
writer.flush();
// 关闭流
reader.close();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
练习:利用字节流读取文件中的数据,每次读一整行,而且不能出现乱码。
import java.io.*;
public class Example {
public static void main(String[] args) {
try {
FileInputStream fileInputStream = new FileInputStream("input.txt");
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String line;
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}