java - 为什么我不能让管道输入/输出流工作
问题描述
我正在尝试自己解决 PipedInputStream 和 PipedOutputStream 如何协同工作。到目前为止,结果是完全失败。
这是我的代码:
import java.io.*;
public class Test implements Runnable {
private PipedOutputStream pause_breaker;
private PipedInputStream pause_breaker_listener;
private BufferedReader br;
private PrintWriter pw;
public void run() {
try {
while(true) {
System.out.println("Now listening...");
String text = br.readLine();
System.out.println("...got " + text);
}
} catch(Exception e) {
System.out.println("run: " + e.getMessage());
}
}
public void pause_test() {
try {
// testing piped streams as pausing tool
pause_breaker = new PipedOutputStream();
pause_breaker_listener = new PipedInputStream();
pause_breaker_listener.connect(pause_breaker);
//pause_breaker.connect(pause_breaker_listener);
br = new BufferedReader(new InputStreamReader(pause_breaker_listener));
pw = new PrintWriter(pause_breaker);
Thread.sleep(1000);
new Thread(this).start();
System.out.println("Waiting for new Thread...");
//Thread.sleep(1000);
System.out.println("Writing to stream...");
pw.write("Test");
pw.flush();
} catch(Exception e) {
System.out.println("pause_test: " + e.getMessage());
}
}
public static void main(String[] args) {
Test t2 = new Test();
t2.pause_test();
}
}
输出是这样的:
$ java Test
Waiting for new Thread...
Writing to stream...
Now listening...
run: Write end dead
似乎什么都没有通过。谁能指出我为什么?
/dr_xemacs
解决方案
你有两个问题:
由于您使用 BufferedReader 从管道中获取项目,因此每个项目都需要有一个尾随换行符
您需要修改线程如何传达该退出的时间。读取线程有一个无限循环,而写入线程在写完一行后立即终止,因此读取线程抛出
IOException: pipe broken
.
推荐阅读
- artifactory - 如何不使用 jfrog cli 提升命令将所有 Docker 标签从 dev repo 提升到 prod
- ios - 在 iOS 上单击某些项目时,iFrame 会滚动到顶部
- python - 无法从 Pandas DataFrame 对象中删除列
- javascript - 如何在 li 元素中的 ng-if 中发送范围变量?
- azure - Azure Speech to Text 教程
- php - Symfony 表单将用户兴趣的选择存储到 UserInterests
- python - 在 python scapy 中解码 MX 记录的 DNS 应答 rrdata
- php - strpos 不适用于逗号分隔字符串中的第一个字符串
- javascript - 如何修复:在线共享点保存当前用户和状态的过滤查找
- python - Tornado-swirl 没有获取 URL 中的参数