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() 方法。