我有一个第三方程序,它将数据放入名为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
}
但两种选择都不会触发。
是否有其他方法可以访问命名管道,从而获得这样的信息? 或者我忽略了什么?
答案 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()
的值。