代码之家  ›  专栏  ›  技术社区  ›  Albatross

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

  •  0
  • Albatross  · 技术社区  · 9 年前

    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. 除非真的出了什么问题,否则管道能保证正常工作吗?

    CentOS 6.7 具有

    这是经过测试的,工作正常,但需要处理转角情况,以确保连续运行。

    2 回复  |  直到 9 年前
        1
  •  2
  •   John Bollinger    9 年前
    1. 如果一段时间内没有来自管道的数据,会发生什么?

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

    我不会指望的。更安全的做法是关闭 读者 在这种情况下创建一个新的。

    1. EOF是否仅在其终止时通过管道发送,否则不发送?

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

        2
  •  0
  •   user207421    9 年前

    如果一段时间内没有来自管道的数据,会发生什么?

    遇到EOF时是否可以重用读取器对象?

    重复使用什么?数据已经到了尽头。这个问题没有出现。

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

    除非真的出了什么问题,否则管道能保证正常工作吗?

    无论是在管道中还是在生活中,都不能保证什么,但如果没有错误,您应该继续读取发送的任何数据。