在我们的 Linux 系统上,我们使用命名管道进行进程间通信(生产者和消费者)。
为了测试消费者(Java)代码,我想(在Java中)实现一个虚拟生产者,它写入连接到消费者的命名管道。
现在测试也应该在 Windows 开发环境中工作。因此,我想知道如何在 Windows 中从 Java 创建命名管道。在 Linux 中我可以使用 mkfifo(称为 using Runtime.exec()
),但在 Windows 上我应该如何做到这一点?
在我们的 Linux 系统上,我们使用命名管道进行进程间通信(生产者和消费者)。
为了测试消费者(Java)代码,我想(在Java中)实现一个虚拟生产者,它写入连接到消费者的命名管道。
现在测试也应该在 Windows 开发环境中工作。因此,我想知道如何在 Windows 中从 Java 创建命名管道。在 Linux 中我可以使用 mkfifo(称为 using Runtime.exec()
),但在 Windows 上我应该如何做到这一点?
链接中的相关部分
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();
}
在 Windows 中,存在命名管道,但它们不能作为可写文件系统中的文件创建,并且没有命令行工具。它们存在于一个特殊的文件系统中,只能使用 Win32 API 创建。
看起来你必须求助于本机代码,或者从管道切换到 IPC 的套接字——这可能是最好的长期解决方案,因为它更便携。
您可以使用 JNA 库https://github.com/java-native-access/jna创建命名管道
JNA 包装器的 API 与 Win32 相同,因此您将能够在 Windows 上使用命名管道的所有功能和功能。
在 Java 中读取和写入现有的命名管道是非常可能的。据我所知,您不能在 Windows 环境中创建命名管道。Linux 是一个不同的故事,因为命名管道可以像文件一样被创建和使用。
与现有管道交互的相关链接:http: //v01ver-howto.blogspot.com/2010/04/howto-use-named-pipes-to-communicate.html
也许可以使用 cygwin 命名管道——如果你所有的进程都是 cygwin。