PipedReader 类(java.io.PipedReader)用于将管道中的内容以字符流形式读取,其工作原理与 PipedInputStream 类似。二者的核心区别在于,PipedInputStream 处理的是字节流,而 PipedReader 专注于字符流,专为文本读取设计。
使用 PipedReader 时,必须将其连接到 PipedWriter 上。在实际应用中,PipedReader 和 PipedWriter 常由不同线程操作,以实现线程间的高效通信。值得注意的是,一个 PipedWriter 仅能与一个 PipedReader 建立连接,确保数据传输的唯一性和准确性。
以下是一个简单的 PipedReader 示例:
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,并且将两者连接在一起。然后分别创建了两个线程,一个线程向 PipedWriter 写入数据,另一个线程从 PipedReader 中读取数据。
PipedReader 的 read() 方法会返回一个 int,其中包含所读取字符的字符值。如果 read() 方法返回 -1,则表示 PipedReader 中已无数据可读,可以关闭。
下面是 read() 方法签名:
int read():读取单个字符。如果到达流的末尾,则返回 -1。
int read(char[] cbuf, int off, int len):将最多 len 个字符读入字符数组。返回读取的字符数,如果到达流的末尾,则返回 -1。
当你从 PipedReader 中读取完字符后,一定要记得关闭它。关闭 PipedReader 的方法非常简单,直接调用其 close() 方法即可。
注意,关闭 PipedReader 并不会关闭与之相连的 PipedWriter,即使当前 PipedReader 已关闭,您也无法将新的 PipedReader 连接到该 PipedWriter。
下面是关闭 PipedWriter 的过程:
pipedReader.close();
你还可以使用 Java7 中引入的 try-with-resources 结构,自动关闭资源:
try(PipedReader pipedReader = new PipedReader(pipedWriter)){
int data = pipedReader.read();
while(data != -) {
System.out.print((char) data));
data = pipedReader.read();
}
}注意,上述示例中没有显示调用 close() 方法,而是 try-with-resources 结构自动调用 close() 方法。