在Java中创build命名pipe道

我正在尝试使用Java创build命名pipe道。 我正在使用Linux。 但是,我遇到了写入pipe道的问题。

File fifo = fifoCreator.createFifoPipe("fifo"); String[] command = new String[] {"cat", fifo.getAbsolutePath()}; process = Runtime.getRuntime().exec(command); FileWriter fw = new FileWriter(fifo.getAbsoluteFile()); BufferedWriter bw = new BufferedWriter(fw); bw.write(boxString); //hangs here bw.close(); process.waitFor(); fifoCreator.removeFifoPipe(fifo.toString()); 

fifoCreator:

 @Override public File createFifoPipe(String fifoName) throws IOException, InterruptedException { Path fifoPath = propertiesManager.getTmpFilePath(fifoName); Process process = null; String[] command = new String[] {"mkfifo", fifoPath.toString()}; process = Runtime.getRuntime().exec(command); process.waitFor(); return new File(fifoPath.toString()); } @Override public File getFifoPipe(String fifoName) { Path fifoPath = propertiesManager.getTmpFilePath(fifoName); return new File(fifoPath.toString()); } @Override public void removeFifoPipe(String fifoName) throws IOException { Files.delete(propertiesManager.getTmpFilePath(fifoName)); } 

我正在写一个由1000行组成的string。 写100行工作,但1000行不行。

但是,如果我在shell上运行“cat fifo”,那么程序将继续执行,并且不会挂起。 奇怪的是,这个程序启动的catsubprocess不起作用。

编辑:我在subprocess上做了一个ps,它有状态“S”。

外部进程有你需要处理的输入和输出。 否则,他们可能会挂起,尽管他们的确切点在哪里挂起。

解决你的问题最简单的方法是改变每一个这样的事情:

 process = Runtime.getRuntime().exec(command); 

对此:

 process = new ProcessBuilder(command).inheritIO().start(); 

Runtime.exec已经过时。 改用ProcessBuilder。

更新:

inheritIO()是将所有Process的输入和输出重定向到父Java进程的输入和输出的简写 。 您可以改为只重定向输入,并自己读取输出:

 process = new ProcessBuilder(command).redirectInput( ProcessBuilder.Redirect.INHERIT).start(); 

然后你将需要从process.getInputStream()读取进程的输出。