Java IO 的流,有三个分类的维度:
- 输入流 or 输出流
- 节点流 or 处理流
- 字节流 or 字符流
在Java IO库中,InputStreamReader和OutputStreamWriter是两个非常重要的类,它们作为字符流和字节流之间的桥梁。
这两个类使得开发者可以方便地以字符为单位读取或写入数据,即使底层数据源或目标是基于字节的。
这两个类的主要作用是将字节流(InputStream 和 OutputStream)转换为字符流(Reader 和 Writer),从而允许我们按照字符(而不是字节)的形式读取或写入数据,这在处理文本数据时特别有用。
一 InputStreamReader (处理流、字符流、输入流)
1. 定义与用途
- InputStreamReader 是字节流通向字符流的桥梁。它读取字节,并使用指定的字符集将其解码为字符。如果未指定字符集,它将使用平台的默认字符集。
- 主要用途
- 读取文件或网络输入流中的文本数据。
- 转换任何类型的 InputStream 为 Reader,以便按字符读取数据。
2.构造方法示例
// 使用默认字符集
InputStreamReader(InputStream in)
// 使用指定的字符集
InputStreamReader(InputStream in, Charset cs)
// 使用指定的字符集名称
InputStreamReader(InputStream in, String charsetName)
3.使用示例
/**
* 将字节流 FileInputStream 包装成 字符流 InputStreamReader,
* 对文件进行读取(按照 utf-8/gbk 格式)进而再包装成 BufferedReader
*/
public class DecoratorStreamReaderDemo {
//使用 InputStreamReader 转换流解决中文乱码问题
//将字节流 FileInputStream 转换成字符流 InputStreamReader,指定编码 gbk/utf-8
public static void main(String[] args) throws IOException {
String filePath = "d:\\a.txt";
//1.把 FileInputStream 转成 InputStreamReader
//2.指定编码 gbk
InputStreamReader isr = new InputStreamReader(new FileInputStream(filePath),"gbk");
//3.把 InputStreamReader 代入 BufferedReader
BufferedReader br = new BufferedReader(isr);
//4.读取
String s = br.readLine();
System.out.println("读取内容:"+ s);
//5.关闭外层流
br.close();
}
}
通常,会将上述代码的 2、3 合在一起:
BufferedReader br2 = new BufferedReader(
new InputStreamReader(new FileInputStream(filePath),"gbk")
);
二 OutputStreamWriter(处理流、字符流、输出流)
1.定义与用途
- OutputStreamWriter 是字符流通向字节流的桥梁。它写入字符,并使用指定的字符集将其编码为字节。如果未指定字符集,它将使用平台的默认字符集。
- 主要用途
- 将文本数据写入文件或网络输出流。
- 转换任何类型的 OutputStream 为 Writer,以便按字符写入数据。
2.构造方法示例
// 使用默认字符集
OutputStreamWriter(OutputStream out)
// 使用指定的字符集
OutputStreamWriter(OutputStream out, Charset cs)
// 使用指定的字符集名称
OutputStreamWriter(OutputStream out, String charsetName)
3.使用示例
/**
* 将字节流 FileOutputStream 包装成 字符流 OutputStreamWriter
* 对文件进行写入(按照 gbk格式,可以指定其他)
*/
public class DecoratorStreamWriterDemo {
// OutputStreamWriter 使用
public static void main(String[] args) throws IOException {
String filePath = "d:\\b.txt";
String charset = "utf8";
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(filePath), charset);
osw.write("hi,小爱同学!");
osw.close();
System.out.println("使用"+charset +"编码方式,保存文件成功");
}
}
注意事项
- 当使用InputStreamReader和OutputStreamWriter时,重要的是要指定一个字符集,特别是当文件或数据流包含非ASCII字符时。这有助于确保字符的正确编码和解码。
- 这两个类通常与BufferedReader和BufferedWriter一起使用,以提供缓冲功能,从而提高读取和写入操作的效率。
- 在处理完文件或网络流后,应确保关闭所有打开的流,以释放系统资源。在上面的示例中,通过调用bufferedReader.close()或bufferedWriter.close()可以自动关闭底层的InputStreamReader/OutputStreamWriter和InputStream/OutputStream。这是因为BufferedReader和BufferedWriter的close方法被设计为关闭其下的所有流。
以上就是 Java IO中的 InputStreamReader 和 OutputStreamWriter 的全部内容,感谢阅读!