如何从Java打开Windows命名管道?

时间:2009-03-11 13:42:08

标签: java windows named-pipes

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

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

现在,测试也应该在Windows开发环境中运行。因此,我想知道如何在Java中从Windows创建命名管道。在Linux中,我可以使用mkfifo(使用Runtime.exec()调用),但是我应该如何在Windows上执行此操作?

5 个答案:

答案 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 existcannot be created as files in a writeable filesystem并且没有命令行工具。它们位于特殊的文件系统中,只能使用Win32 API创建。

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

答案 2 :(得分: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上使用命名管道的所有功能和强大功能。

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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