无法从Java中删除命名管道

时间:2015-07-15 12:53:23

标签: java named-pipes nosuchfileexception

我正在Java中创建一个命名管道,它使用以下代码:

final String [] mkfifo = {"/bin/sh", "-c", "mkfifo ~/myFifo && tail -f ~/myFifo | csh -s"};

Process p = Runtime.getRuntime().exec(mkfifo);

但是当我尝试使用以下代码删除它时,我正在获得NoSuchFileException

Path fifoPath = Paths.get("~/myFifo");

try {
    Files.delete(fifoPath);
} catch (Exception e) {
    System.err.println(e);
}

我已经确认该文件确实是通过在执行程序期间发出ls ~来创建的,并且在抛出异常并且程序执行结束后仍然保留~/myFifo。 / p>

我认为... && tail ...可能会导致一些问题,以防它以某种方式阻塞,所以我做了更改以创建命名管道:

final String [] mkfifo = {"/bin/sh", "-c", "mkfifo ~/myFifo"};

Process p = Runtime.getRuntime().exec(mkfifo);

仍然创建了管道,这很好。我还尝试通过exec

以较少原生的Java方式删除管道
final String [] rmfifo = { "/bin/rm ~/myFifo" };

Runtime.getRuntime().exec(rmfifo);

这些似乎都不起作用。有什么想法吗?

谢谢, erip

1 个答案:

答案 0 :(得分:3)

问题是~/myFifo

Java不理解~

我运行了以下代码。

Path fifoPath = Paths.get("/home/russell/myFifo");
try {
    Files.delete(fifoPath);
} catch (Exception ex) {
    System.err.println(ex);
}

它跑得很好。

String home = System.getProperty("user.home");
Path fifoPath = Paths.get(home + "/myFifo");
try {
    Files.delete(fifoPath);
} catch (Exception ex) {
    System.err.println(ex);
}

以上代码也适用于我的系统。

~/是一个shell的东西,所以java不会把它拿起来。

它首先实际创建文件的原因是因为您使用/bin/sh来运行mkfifo命令,而sh会翻译~/。< / p>