在我们的Linux系统上,我们使用命名管道进行进程间通信(生产者和消费者)。
为了测试使用者(Java)代码,我想实现(在Java中)一个虚拟生成器,它写入连接到使用者的命名管道。
现在,测试也应该在Windows开发环境中运行。因此,我想知道如何在Java中从Windows创建命名管道。在Linux中,我可以使用mkfifo(使用Runtime.exec()
调用),但是我应该如何在Windows上执行此操作?
答案 0 :(得分:24)
Use Named Pipes to Communicate Between Java and .Net Processes
链接中的相关部分
try {
// Connect to the pipe
RandomAccessFile pipe = new RandomAccessFile("\\\\.\\pipe\\testpipe", "rw");
String echoText = "Hello word\n";
// write to pipe
pipe.write ( echoText.getBytes() );
// read response
String echoResponse = pipe.readLine();
System.out.println("Response: " + echoResponse );
pipe.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
答案 1 :(得分:8)
在Windows中,named pipes exist但cannot be created as files in a writeable filesystem并且没有命令行工具。它们位于特殊的文件系统中,只能使用Win32 API创建。
看起来您将不得不求助于本机代码,或者从管道切换到IPC的套接字 - 可能是最好的长期解决方案,因为它更便携。
答案 2 :(得分:4)
您可以使用JNA库https://github.com/java-native-access/jna
创建命名管道JNA包装器的API与Win32相同,因此您将能够在Windows上使用命名管道的所有功能和强大功能。
答案 3 :(得分:1)
在Java中读取和写入现有命名管道是非常可能的。据我所知,您无法在Windows环境中创建命名管道。 Linux是一个不同的故事,因为可以像文件一样创建和使用命名管道。
与现有管道互动的相关链接:http://v01ver-howto.blogspot.com/2010/04/howto-use-named-pipes-to-communicate.html
答案 4 :(得分:0)
也许可以使用cygwin命名管道 - 如果所有进程都是cygwin。