Java PipedWriter 类
最后修改时间:2025 年 4 月 16 日
java.io.PipedWriter 类是一个字符流,可以连接到 PipedReader 以创建通信管道。它以线程安全的方式将字符写入连接的 PipedReader。
PipedWriter 通常用于线程之间的通信。管道维护一个内部缓冲区,默认大小为 1024 个字符。管道的两端必须连接才能正常运行。
PipedWriter 类概述
PipedWriter 继承自 Writer 并提供管道输出操作。主要方法包括写入字符、连接到读取器、刷新和关闭。如果管道中断,该类将抛出 IOException。
public class PipedWriter extends Writer {
public PipedWriter();
public PipedWriter(PipedReader snk);
public synchronized void connect(PipedReader snk);
public void write(int c);
public void write(char[] cbuf, int off, int len);
public synchronized void flush();
public void close();
}
上面的代码显示了 PipedWriter 提供的关键方法。这些方法允许将字符写入连接的 PipedReader。连接可以在创建时或稍后建立。
创建 PipedWriter
PipedWriter 可以创建,无论是否连接了读取器。如果创建时未连接,则必须在使用前连接。每个 PipedWriter 实例只能建立一次连接。
import java.io.PipedReader;
import java.io.PipedWriter;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
try {
// Create unconnected PipedWriter
PipedWriter writer1 = new PipedWriter();
// Create connected PipedWriter
PipedReader reader = new PipedReader();
PipedWriter writer2 = new PipedWriter(reader);
System.out.println("Unconnected PipedWriter created");
System.out.println("Connected PipedWriter created");
writer1.close();
writer2.close();
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
此示例演示了创建 PipedWriter 的不同方法。第一个未连接,必须稍后连接。第二个预先连接到 PipedReader。完成后,始终关闭管道的两端以释放资源。
将 PipedWriter 连接到 PipedReader
未连接的 PipedWriter 必须在使用前连接到 PipedReader。可以使用 connect 方法建立连接。为了成功连接,两端都必须处于未连接状态。
import java.io.PipedReader;
import java.io.PipedWriter;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
try {
PipedWriter writer = new PipedWriter();
PipedReader reader = new PipedReader();
// Connect the writer to the reader
writer.connect(reader);
System.out.println("PipedWriter successfully connected to PipedReader");
// Write some data
writer.write("Hello from PipedWriter".toCharArray());
// Read the data
char[] buffer = new char[100];
int bytesRead = reader.read(buffer);
System.out.println("Read from PipedReader: " +
new String(buffer, 0, bytesRead));
writer.close();
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
此示例演示了如何在创建后将 PipedWriter 连接到 PipedReader。连接后,写入写入器的数据可供从读取器读取。必须在任何 I/O 操作之前建立连接。
使用 PipedWriter 进行线程通信
PipedWriter 常用作线程之间的通信。一个线程写入数据,而另一个线程读取数据。这提供了一种线程安全的方式在线程之间传递字符数据。
import java.io.PipedReader;
import java.io.PipedWriter;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
try {
PipedWriter writer = new PipedWriter();
PipedReader reader = new PipedReader(writer);
// Writer thread
Thread writerThread = new Thread(() -> {
try {
writer.write("Message from writer thread".toCharArray());
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
});
// Reader thread
Thread readerThread = new Thread(() -> {
try {
char[] buffer = new char[100];
int bytesRead = reader.read(buffer);
System.out.println("Reader thread received: " +
new String(buffer, 0, bytesRead));
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
});
writerThread.start();
readerThread.start();
writerThread.join();
readerThread.join();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
此示例演示了使用 PipedWriter 和 PipedReader 进行线程间通信。写入线程发送消息,读取线程接收该消息。管道自动处理线程之间的同步。
使用 PipedWriter 写入数据
PipedWriter 提供了几种写入字符数据的方法。可以写入单个字符,也可以批量写入字符数组。所有写入操作都是线程安全的。
import java.io.PipedReader;
import java.io.PipedWriter;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
try (PipedWriter writer = new PipedWriter();
PipedReader reader = new PipedReader(writer)) {
// Write single character
writer.write('A');
// Write character array
char[] data = {'B', 'C', 'D'};
writer.write(data);
// Write portion of array
writer.write("EFGHIJKLMNOPQRSTUVWXYZ".toCharArray(), 0, 5);
writer.flush();
// Read all written data
char[] buffer = new char[100];
int bytesRead = reader.read(buffer);
System.out.println("Received data: " +
new String(buffer, 0, bytesRead));
} catch (IOException e) {
e.printStackTrace();
}
}
}
此示例展示了使用 PipedWriter 写入数据的不同方式。可以写入单个字符、完整数组和部分数组。flush 方法确保所有写入的数据立即可供读取器使用。
处理管道中断错误
当连接的 PipedReader 关闭或遇到错误时,PipedWriter 将对后续操作抛出 IOException。这被称为“管道中断”情况。
import java.io.PipedReader;
import java.io.PipedWriter;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
try {
PipedWriter writer = new PipedWriter();
PipedReader reader = new PipedReader(writer);
// Close reader before writing
reader.close();
try {
writer.write("Test".toCharArray());
System.out.println("Write succeeded unexpectedly");
} catch (IOException e) {
System.out.println("Caught expected IOException: " +
e.getMessage());
}
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
此示例演示了管道中断的情况。当读取器关闭时,任何尝试写入写入器的操作都将抛出 IOException。在使用管道流时,适当的错误处理至关重要。
来源
在本文中,我们介绍了 Java PipedWriter 类的基本方法和特性。了解这些概念对于使用 Java 应用程序中的字符流实现线程间通信至关重要。
作者
列出所有Java教程。