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

Phi*_*ipp 26 java windows named-pipes

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

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

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

小智 24

使用命名管道在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();
}
Run Code Online (Sandbox Code Playgroud)

  • 我得到了上面问题的答案:在Java中,不可能创建命名管道(除非使用[JNA](https://github.com/java-native-access/jna/blob/master/contrib/) platform/test/com/sun/jna/platform/win32/Kernel32NamedPipeTest.java)),仅打开现有的(见[this answer](http://stackoverflow.com/a/2247022/267197)和[that交(https://cdimascio.wordpress.com/2014/01/11/named-pipes-with-java/)).非常感谢下面的答案. (6认同)
  • 上面的代码是否适用于某人?我在Windows 7 x64,Java 1.7.0_45上尝试了它,它导致了java.io.RandomAccessFile.open中的`java.io.FileNotFoundException:\\.\ pipe\testpipe(系统无法找到指定的文件)(本机方法) )在java.io.RandomAccessFile.<init>(RandomAccessFile.java:122)`.它应该像[在这篇文章中]提到的那样正手创建(http://answers.microsoft.com/en-us/windows/forum/windows8_1-files/windows-81-enterprise-64-bit-running-java-jdk/f67d1302-905e-4511-BA1B-0888b259258a)? (2认同)
  • @dma_k我得到同样的错误。似乎无法使用Java创建命名管道,但代码可与在其他进程(例如,链接示例中的.Net进程)中创建的现有管道一起使用。 (2认同)

Mic*_*rdt 9

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

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


jre*_*not 7

您可以使用 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 上使用命名管道的所有功能和功能。