PipedWriter 类(java.io.PipedWriter)可将字符流写入 Java 管道。在这方面,PipedWriter 的工作原理与 PipedOutputStream 非常相似,只是 PipedOutputStream 基于字节,而 PipedWriter 基于字符。换句话说,PipedWriter 是用来写文本的。
通常,PipedWriter 连接到 PipedReader,PipedWriter 和 PipedReader 通常由不同的线程使用。
下面是一个简单的 PipedWriter 示例:
package com.hxstrive.java_io; import java.io.PipedReader; import java.io.PipedWriter; public class PipedReaderExample { public static void main(String[] args) throws Exception { try(PipedWriter pipedWriter = new PipedWriter(); PipedReader pipedReader = new PipedReader(pipedWriter) ) { // 写入数据 new Thread(() -> { try { // 向管道写入数据 pipedWriter.write("hello world"); } catch (Exception e) { e.printStackTrace(); } }).start(); // 接收数据 new Thread(() -> { try { char[] buffer = new char[20]; // 从管道读取数据, 返回读取的字符数 int length = pipedReader.read(buffer); System.out.println("接收数据: " + String.valueOf(buffer, 0, length)); // 退出程序 System.exit(0); } catch (Exception e) { e.printStackTrace(); } }).start(); // 阻塞主线程, 防止主线程退出 Thread.sleep(Long.MAX_VALUE); } } }
上述示例,创建了两个线程,一个线程向 PipedWriter 写入,另一个线程从 PipedReader 中读取数据,并且利用 Java7 新特性 try-with-resources 来自动释放资源。
注意:PipedWriter 必须始终连接到 PipedReader。这样连接后,它们就形成了一个 Java 管道。
PipedWriter 的 write() 方法接收一个 int,其中包含要写入的字节的字节值。这里的 int 类型参数实际上代表的是一个字符的 Unicode 码点,范围是 0 到 65535。
还有一些版本的 write() 方法使用字符串、字符数组等。如下:
write(char[] cbuf, int off, int len) 将字符数组 cbuf 中从偏移量 off 开始的 len 个字符写入此管道输出流。
write(String str, int off, int len) 将字符串 str 中从偏移量 off 开始的 len 个字符写入此管道输出流。
当你完成向 PipedWriter 写字符后,应记得关闭它。关闭 PipedWriter 仅需要调用它的 close() 方法。如下:
pipedWriter.close();
你还可以使用 Java7 中引入的 try-with-resources 结构,自动关闭资源,如下:
try(PipedWriter pipedWriter = new PipedWriter(){ pipedWriter.write("data 1"); }
注意,上述示例中,没有手动调用 close() 方法,而是通过 try-with-resources 结构自动关闭资源。