¿Cómo abrir una tubería con nombre de Windows desde Java?
named-pipes (5)
En Windows, existen pipes con nombre , pero no se pueden crear como archivos en un sistema de archivos grabable y no hay una herramienta de línea de comandos. Viven en un sistema de archivos especial y solo se pueden crear utilizando la API de Win32.
Parece que tendrá que recurrir al código nativo, o cambiar de tuberías a enchufes para IPC, probablemente la mejor solución a largo plazo, ya que es mucho más portátil.
En nuestro sistema Linux utilizamos pipes con nombre para la comunicación entre procesos (un productor y un consumidor).
Para probar el código de consumidor (Java), me gustaría implementar (en Java) un productor ficticio que escribe en una tubería con nombre que está conectada al consumidor.
Ahora la prueba también debería funcionar en el entorno de desarrollo de Windows. Por lo tanto, me gustaría saber cómo crear un conducto con nombre en Windows desde Java. En Linux puedo usar mkfifo (llamado usando Runtime.exec()
), pero ¿cómo debo hacer esto en Windows?
Es muy posible leer y escribir en una tubería con nombre existente en Java. A mi entender, no puede crear una tubería con nombre en un entorno de Windows. Linux es una historia diferente ya que los pipes con nombre se pueden crear y consumir como archivos.
Enlace relevante para interactuar con un conducto existente: http://v01ver-howto.blogspot.com/2010/04/howto-use-named-pipes-to-communicate.html
Puede crear un conducto con nombre utilizando la biblioteca JNA https://github.com/java-native-access/jna
Se muestra claramente en la siguiente prueba: JNA
API de JNA wrapper es lo mismo que Win32, por lo tanto, podrás usar todas las características y potencia de named pipes en Windows.
tal vez podría usar pipes named cygwin, si todos sus procesos son cygwin.
Use Canalizaciones con nombre para comunicarse entre Java y procesos .Net
Parte relevante en el enlace
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();
}