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

Java 如何检测名为pipe的窗口是否已关闭?,java,windows,named-pipes,Java,Windows,Named Pipes,我有一个第三方程序,它将数据放入一个名为pipe的windows中 我用手接触管道 String pipename = "\\\\.\\pipe\\the_pipe"; RandomAccessFile pipe = new RandomAccessFile(pipename, "r"); DataInputStream input = new DataInputStream(Channels.newInputStream(pipe.getChannel())); 因此,有时有人会有一个“完美

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

我用手接触管道

String pipename = "\\\\.\\pipe\\the_pipe";
RandomAccessFile pipe = new RandomAccessFile(pipename, "r");
DataInputStream input = new DataInputStream(Channels.newInputStream(pipe.getChannel()));
因此,有时有人会有一个“完美”的想法,在我的小型数据转换工具关闭管道之前关闭第三方程序。发生这种情况时,我的工具会将收到的上百万次消息写入resultfile,并在数小时内成功填充每个hdd直到最后一个字节,因为我无法检查管道是否已关闭

我尝试过的事情:

// checking file descriptor and file channel
if(!(pipe.getFD().valid() && pipe.getChannel().isOpen())) {
  // quit
}
但这两种选择都不会触发

是否有其他方法可以访问可以获取此类信息的命名管道?
还是我忽略了什么?

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

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

在读取端,NuProcess正在使用Windows
IOCompletionPorts
进行异步I/O(in),这对于您所需要的(或不需要的)功能来说可能有些过分。但是,一旦你在设置管道时弄湿了脚,你就应该能够从那里阅读微软的API文档来了解它

当这种情况发生时,我的工具会将上次收到的数百万次消息写入resultfile


仅当您的工具忽略了
EOFEExceptions
,并且
read()

isOpen()
中的-1返回值只会告诉您是否尚未关闭端点
isValid()
只会告诉您FD是否仍然有效,直到您结束为止。啊,谢谢您指出这一点!最后,我真的忽略了一个异常处理,所以这是我这边的一个错误——并不缺乏知识很好的观点!我真的“忽略”了它,但出于偶然。。。因为我在catch块中有一些处理原始文件读取的决定,当我不读取文件时,我忘记了处理EOFException。非常感谢。