如何检测名为pipe的窗口是否已关闭?

时间:2013-12-03 13:27:59

标签: java windows named-pipes

我有一个第三方程序,它将数据放入名为pipe的窗口。

我用

访问管道
String pipename = "\\\\.\\pipe\\the_pipe";
RandomAccessFile pipe = new RandomAccessFile(pipename, "r");
DataInputStream input = new DataInputStream(Channels.newInputStream(pipe.getChannel()));

因此,有时某人会在我的小型数据转换工具之前获得“完美”的想法来关闭第三方程序,这当然会关闭管道。当发生这种情况时,我的工具会将收到的最后一条消息写入结果文件中,并在几小时内将每个硬盘成功填写到最后一个字节,因为我无法检查管道是否已关闭。

我尝试过的事情:

// checking file descriptor and file channel
if(!(pipe.getFD().valid() && pipe.getChannel().isOpen())) {
  // quit
}

但两种选择都不会触发。

是否有其他方法可以访问命名管道,从而获得这样的信息? 或者我忽略了什么?

2 个答案:

答案 0 :(得分:1)

我建议您查看JNA直接访问命名管道。是的,如果使用JNA,则可以检测到管道闭合。

我在github.com上的一个名为NuProcess的项目中已经这样做了。特别是,请查看com.zaxxer.nuprocess.windows包。查看用于设置管道的WindowsProcess.createPipes()方法(代码创建两端,您只需要一个)。

在读取方面, NuProcess 正在使用Windows IOCompletionPorts进行异步I / O(在ProcessCompletions.java中),这对于您需要(或不是)的内容可能过度。但是,一旦你弄湿了设置管道,你应该能够从那里读出Microsoft API文档。

答案 1 :(得分:1)

  

当发生这种情况时,我的工具会将收到的最后一条消息写入结果文件

仅当您的工具忽略EOFExceptions而-1才会返回read()的值。