【Java教程】Day10-09 IO:Writer 和 OutputStream

在 Java 中,Writer 和 OutputStream 都是输出流接口,用于将数据写入不同类型的目标。它们之间的区别在于处理数据的单位和方式。Writer 主要处理字符数据,并具有编码转换功能,而 OutputStream 则处理字节数据。本文将深入探讨这两者的差异,并展示如何在实际编程中使用它们。

 

1. OutputStream 与 Writer 的区别

OutputStream 是字节输出流,用于写入字节数据;而 Writer 是字符输出流,用于写入字符数据。以下是它们的主要区别:

类型OutputStreamWriter
流类型字节流(以 byte 为单位)字符流(以 char 为单位)
写入单元写入字节(0~255):void write(int b)写入字符(0~65535):void write(int c)
写入数组方法写入字节数组:void write(byte[] b)写入字符数组:void write(char[] c)
特有方法无特有方法写入字符串:void write(String s)

1.1 OutputStream(字节输出流)

OutputStream 适用于处理字节数据,通常用于写入二进制文件(如图片、音频等)。它的写入方式是通过 write(int b) 方法逐个字节写入数据,write(byte[] b) 方法可以一次性写入字节数组。

1.2 Writer(字符输出流)

与 OutputStream 不同,Writer 是处理字符数据的输出流。它提供了写入字符的方法(write(int c)),并且能够处理字符数组或字符串。Writer 适用于处理文本文件,尤其是在需要考虑字符编码时。

 

 

2. 使用 Writer 进行字符输出

Writer 是所有字符输出流的基类。常见的子类包括 FileWriterCharArrayWriter 和 StringWriterWriter 提供了几种常用的写入方法:

  • write(int c):写入单个字符。

  • write(char[] c):写入字符数组。

  • write(String s):写入字符串。

2.1 FileWriter:将字符写入文件

FileWriter 是 Writer 的一个子类,专门用于向文件中写入字符数据。它的使用方法与 FileReader 类似,支持指定字符编码来避免乱码问题。以下是一个例子:

javatry (Writer writer = new FileWriter("readme.txt", StandardCharsets.UTF_8)) {    writer.write('H'); // 写入单个字符    writer.write("Hello".toCharArray()); // 写入字符数组    writer.write("Hello"); // 写入字符串}

 

在这个例子中,我们创建了一个 FileWriter 实例,将不同类型的数据(单个字符、字符数组和字符串)写入到文件 readme.txt 中。通过指定 UTF-8 编码,我们确保文件内容的字符正确编码,避免了乱码问题。

2.2 CharArrayWriter:内存中的字符输出

CharArrayWriter 是一个基于内存的字符输出流,它提供了一个内存缓冲区,可以向其中写入字符。写入的数据可以通过 toCharArray() 方法获取。以下是使用 CharArrayWriter 的示例:

javatry (CharArrayWriter writer = new CharArrayWriter()) {    writer.write(65);  // 写入字符 'A'    writer.write(66);  // 写入字符 'B'    writer.write(67);  // 写入字符 'C'    char[] data = writer.toCharArray(); // 获取字符数组:{'A', 'B', 'C'}}

 

在这个例子中,字符 'A''B' 和 'C' 被写入到 CharArrayWriter 的缓冲区中,并最终通过 toCharArray() 方法转换为字符数组。

2.3 StringWriter:将字符输出到 String 中

StringWriter 是一个类似于 CharArrayWriter 的类,它在内部维护一个 StringBuffer,并提供了 Writer 接口。使用 StringWriter,我们可以将字符数据写入到 StringBuffer 中,并最终获取到构造的字符串。

javatry (StringWriter writer = new StringWriter()) {    writer.write("Hello, StringWriter!");    String result = writer.toString();  // 获取字符串}

 

2.4 OutputStreamWriter:将 OutputStream 转换为 Writer

OutputStreamWriter 是一个桥接类,它将字节流(OutputStream)转换为字符流(Writer)。当需要处理字节流并指定字符编码时,OutputStreamWriter 提供了一种方便的方式。以下是一个示例:

javatry (Writer writer = new OutputStreamWriter(new FileOutputStream("readme.txt"), "UTF-8")) {    writer.write("Hello, OutputStreamWriter!");}

 

在这个示例中,OutputStreamWriter 将一个 FileOutputStream 转换为 Writer,并通过指定 UTF-8 编码确保字符数据被正确写入文件。

 

 

3. 小结

  • Writer 是字符输出流的基类,它提供了写入字符、字符数组和字符串的功能。

  • FileWriter 用于将字符数据写入文件,支持指定编码。

  • CharArrayWriter 和 StringWriter 都是基于内存的字符输出流,分别将字符数据保存到字符数组和字符串中。

  • OutputStreamWriter 是将字节流转换为字符流的桥接类,它允许我们将字节数据以字符流的方式进行输出。

 

总之,Writer 提供了更高层次的抽象,处理字符数据时更加便捷。我们可以通过 OutputStreamWriter 等类将字节流转换为字符流,从而支持字符编码转换。这些类的使用方式与 try-with-resources 语法结合,可以确保在流操作完成后自动关闭流,避免资源泄漏。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值