Java IO 教程

Java IO:PipedReader 类

PipedReader 类(java.io.PipedReader)用于将管道中的内容以字符流形式读取,其工作原理与 PipedInputStream 类似。二者的核心区别在于,PipedInputStream 处理的是字节流,而 PipedReader 专注于字符流,专为文本读取设计。

使用 PipedReader 时,必须将其连接到 PipedWriter 上。在实际应用中,PipedReader 和 PipedWriter 常由不同线程操作,以实现线程间的高效通信。值得注意的是,一个 PipedWriter 仅能与一个 PipedReader 建立连接,确保数据传输的唯一性和准确性。

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 中读取数据。

read()

PipedReader 的 read() 方法会返回一个 int,其中包含所读取字符的字符值。如果 read() 方法返回 -1,则表示 PipedReader 中已无数据可读,可以关闭。

下面是 read() 方法签名:

  • int read():读取单个字符。如果到达流的末尾,则返回 -1。

  • int read(char[] cbuf, int off, int len):将最多 len 个字符读入字符数组。返回读取的字符数,如果到达流的末尾,则返回 -1。

关闭 PipedReader

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

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号