使用Java从命名管道连续读取

时间:2017-06-29 22:05:10

标签: java named-pipes

我试图使用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);
        }       
}       

问题

  1. 如果管道中没有数据一段时间会发生什么?
  2. 遇到Reader时可以重用EOF个对象吗?
  3. EOF是仅在终止时通过管道发送的,否则不是?
  4. 除非确实出现问题,否则管道是否保证有效并且正常工作?
  5. 环境 CentOS 6.7 Java 7

    这是经过测试并且工作正常但需要处理角落情况以确保连续操作。

2 个答案:

答案 0 :(得分:2)

  
      
  1. 如果管道中没有数据一段时间会发生什么?
  2.   

程序将阻塞,直到有数据要读取或检测到EOF,就像连接到任何其他类型文件的Reader一样。

  
      
  1. 遇到EOF时可以重复使用Reader对象吗?
  2.   

我不会指望它。在这种情况下关闭Reader并创建一个新的更安全。

  
      
  1. EOF是否仅在终止时通过管道发送而不是其他?
  2.   

在Unix上,当从一个写入器变为零时,将从管道接收到EOF,此时不再有可用的数据。我不确定Windows命名管道语义在这方面是否有所不同,但是因为你在Linux上,这对你来说无关紧要。

  
      
  1. 除非确实出现问题,否则管道是否保证有效?
  2.   

如果命名管道实际上存在于文件系统上并且您具有足够的权限,那么您应该可靠地打开它以进行读取,但这可能会阻塞,直到至少有一个编写器。除此之外,我不确定你的意思。

答案 1 :(得分:0)

  

如果管道中没有数据一段时间会发生什么?

无。它会阻止。

  

遇到EOF时可以重复使用Reader对象吗?

重用什么?它已经到了数据的末尾。问题不会出现。

  

EOF是否仅在终止时通过管道发送而不是其他?

当对等体关闭管道末端时发送。

  

除非确实出现问题,否则管道是否保证有效并且有效?

在管道或生活中没有任何保证,但在没有错误的情况下,您应该继续阅读所发送的任何数据。