Java IO中的 InputStreamReader 和 OutputStreamWriter


Java IO 的流,有三个分类的维度:

  • 输入流 or 输出流
  • 节点流 or 处理流
  • 字节流 or 字符流
    在这里插入图片描述

在Java IO库中,InputStreamReader和OutputStreamWriter是两个非常重要的类,它们作为字符流和字节流之间的桥梁。

这两个类使得开发者可以方便地以字符为单位读取或写入数据,即使底层数据源或目标是基于字节的。

这两个类的主要作用是将字节流(InputStream 和 OutputStream)转换为字符流(Reader 和 Writer),从而允许我们按照字符(而不是字节)的形式读取或写入数据,这在处理文本数据时特别有用。

一 InputStreamReader (处理流、字符流、输入流)

1. 定义与用途

  • InputStreamReader 是字节流通向字符流的桥梁。它读取字节,并使用指定的字符集将其解码为字符。如果未指定字符集,它将使用平台的默认字符集。
  • 主要用途
    1. 读取文件或网络输入流中的文本数据。
    2. 转换任何类型的 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 是字符流通向字节流的桥梁。它写入字符,并使用指定的字符集将其编码为字节。如果未指定字符集,它将使用平台的默认字符集。
  • 主要用途
    1. 将文本数据写入文件或网络输出流。
    2. 转换任何类型的 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 的全部内容,感谢阅读!

  • 21
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值