我试图使用java从命名管道连续读取。 This question为python / bash回答它。
public class PipeProducer {
private BufferedReader pipeReader;
public PipeProducer(String namedPipe) throws IOException {
this.pipeReader = new BufferedReader(new FileReader(new File(namedPipe)));
}
public void process() {
while ((msg = this.pipeReader.readLine()) != null) {
//Process
}
}
public static void main(String args[]) throws JSONException,IOException {
PipeProducer p = new PipeProducer("/tmp/testpipe");
while(true) {
p.process();
System.out.println("Encountered EOF");
now = new Date();
System.out.println("End : " + now);
}
}
问题
Reader
时可以重用EOF
个对象吗?EOF
是仅在终止时通过管道发送的,否则不是? 环境 CentOS 6.7 Java 7
这是经过测试并且工作正常但需要处理角落情况以确保连续操作。
答案 0 :(得分:2)
- 如果管道中没有数据一段时间会发生什么?
醇>
程序将阻塞,直到有数据要读取或检测到EOF,就像连接到任何其他类型文件的Reader
一样。
- 遇到EOF时可以重复使用Reader对象吗?
醇>
我不会指望它。在这种情况下关闭Reader
并创建一个新的更安全。
- EOF是否仅在终止时通过管道发送而不是其他?
醇>
在Unix上,当从一个写入器变为零时,将从管道接收到EOF,此时不再有可用的数据。我不确定Windows命名管道语义在这方面是否有所不同,但是因为你在Linux上,这对你来说无关紧要。
- 除非确实出现问题,否则管道是否保证有效?
醇>
如果命名管道实际上存在于文件系统上并且您具有足够的权限,那么您应该可靠地打开它以进行读取,但这可能会阻塞,直到至少有一个编写器。除此之外,我不确定你的意思。
答案 1 :(得分:0)
如果管道中没有数据一段时间会发生什么?
无。它会阻止。
遇到EOF时可以重复使用Reader对象吗?
重用什么?它已经到了数据的末尾。问题不会出现。
EOF是否仅在终止时通过管道发送而不是其他?
当对等体关闭管道末端时发送。
除非确实出现问题,否则管道是否保证有效并且有效?
在管道或生活中没有任何保证,但在没有错误的情况下,您应该继续阅读所发送的任何数据。