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

Read continuously from a named pipe using Java

我正在尝试使用 java 从命名管道连续读取。 回答 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. 遇到EOF时是否可以重用Reader对象?
  3. 是否 EOF 仅在管道终止时才由管道发送,否则不会发送?
  4. 除非真的出现问题,否则 pipe 是否保证存活和工作?

环境是 CentOS 6.7Java 7

这已经过测试并且工作正常,但需要处理特殊情况以确保连续运行。

  1. What happens if there is no data from pipe for some time ?

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

  1. Can Reader object be reused when EOF is encountered ?

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

  1. Is EOF is sent by pipe only when it terminate and not otherwise ?

在 Unix 上,当管道从一个写入器变为零写入器时,当没有更多数据可用时,将从管道接收 EOF。我不确定 Windows 命名管道语义在这方面是否有所不同,但既然你在 Linux,那对你来说并不重要。

  1. Does pipe guarantees to be alive and working unless something really goes wrong ?

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

What happens if there is no data from pipe for some time?

没有。它会阻塞。

Can Reader object be reused when EOF is encountered?

重用什么?它已经到了数据的末尾。问题不成立。

Is EOF is sent by pipe only when it terminate and not otherwise?

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

Does pipe guarantees to be alive and working unless something really goes wrong?

没有什么是可以保证的,无论是在管道中还是在生活中,但在没有错误的情况下,您应该继续读取发送的任何数据。