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-8public static void main(String[] args) throws IOException {String filePath = "d:\\a.txt";//1.把 FileInputStream 转成 InputStreamReader//2.指定编码 gbkInputStreamReader isr = new InputStreamReader(new FileInputStream(filePath),"gbk");//3.把 InputStreamReader 代入 BufferedReaderBufferedReader 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 的全部内容,感谢阅读!