28

在我们的 Linux 系统上,我们使用命名管道进行进程间通信(生产者和消费者)。

为了测试消费者(Java)代码,我想(在Java中)实现一个虚拟生产者,它写入连接到消费者的命名管道。

现在测试也应该在 Windows 开发环境中工作。因此,我想知道如何在 Windows 中从 Java 创建命名管道。在 Linux 中我可以使用 mkfifo(称为 using Runtime.exec()),但在 Windows 上我应该如何做到这一点?

4

5 回答 5

28

使用命名管道在 Java 和 .Net 进程之间进行通信

链接中的相关部分

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();
}
于 2010-04-09T08:04:07.513 回答
10

在 Windows 中,存在命名管道,但它们不能作为可写文件系统中的文件创建,并且没有命令行工具。它们存在于一个特殊的文件系统中,只能使用 Win32 API 创建。

看起来你必须求助于本机代码,或者从管道切换到 IPC 的套接字——这可能是最好的长期解决方案,因为它更便携。

于 2009-03-11T13:55:34.617 回答
4

您可以使用 JNA 库https://github.com/java-native-access/jna创建命名管道

它清楚地显示在以下测试中:https ://github.com/java-native-access/jna/blob/master/contrib/platform/test/com/sun/jna/platform/win32/Kernel32NamedPipeTest.java

JNA 包装器的 API 与 Win32 相同,因此您将能够在 Windows 上使用命名管道的所有功能和功能。

于 2018-01-08T11:14:49.797 回答
2

在 Java 中读取和写入现有的命名管道是非常可能的。据我所知,您不能在 Windows 环境中创建命名管道。Linux 是一个不同的故事,因为命名管道可以像文件一样被创建和使用。

与现有管道交互的相关链接:http: //v01ver-howto.blogspot.com/2010/04/howto-use-named-pipes-to-communicate.html

于 2013-03-20T12:13:14.283 回答
0

也许可以使用 cygwin 命名管道——如果你所有的进程都是 cygwin。

于 2011-06-16T16:16:11.387 回答