2009-10-27 14 views
8

Mi consulta es sobre cuál es la mejor manera de leer/escribir en un linux Pipe en Java? Ya estoy usando el java.io.RandomAccessFile comoLectura/escritura en linux Pipe usando Java

RandomAccessFile file = new RandomAccessFile("/dev/zap/16", "rw"); 

y luego pasarlo al subproceso de trabajo que dice que después de cada 2 ms como

byte[] buffer = new byte[16]; 
    file.read(buffer); 

Es que no leen de la pipa, pero sospecho que algunos bytes se sobrescriben. ¿Sabes cómo Linux (ubuntu) maneja el buffer para pipe's?

+0

¿Cuál es la conexión con el asterisco? –

+0

En realidad,/dev/zap/16 es creado por el controlador de Zaptel utilizado para Asterisk cuando tiene instalada la tarjeta SS7 en su máquina. Asterisk tiene un módulo que lee este conducto pero está en código nativo. Estoy tratando de hacer que esto funcione en Java. Fuera del tema, pero si alguno de ustedes intenta instalar Asterisk + SS7 aquí está mi experiencia http://amitbhayani.blogspot.com/2009/04/asterisk-ss7.html –

Respuesta

11

Nunca he intentado esto por mí mismo, pero lo que hace se siente simplemente mal. Las tuberías de Linux son Primero en entrar, Primero en salir (FIFO) por definición. Por lo tanto, solo debería poder leer los bytes en el mismo orden en que los escribió, no de forma aleatoria. Sugeriría usar un File normal en su lugar y debería funcionar bien.

+1

¿Quiere decir un 'FileInputStream' normal? Eso es lo que probaría primero también. – erickson

+1

'FileInputStream' y' FileOutputStream' respectivamente, sí – sfussenegger

+0

Interesante ... Cada tutorial que encontré en pipes en java está usando RandomAccessFile. – Belovoj

6

Las tuberías no son manejadas de ninguna manera especial por Java, hasta donde yo sé. Simplemente abra el archivo para escribir y escribir en él.

No se puede "sobreescribir" nada en una tubería, ya que no se puede buscar en una tubería. Por la misma razón, un RandomAccessFile no es la opción más inteligente de usar (dado que un conducto es explícitamente no un archivo de acceso aleatorio). Sugeriría usar un FileOutputStream en su lugar.

También tenga en cuenta que no se garantiza que read() lea hasta que el búfer esté lleno. También puede leer un solo byte y debe verificar su valor de retorno y posiblemente el bucle para leer el búfer completo.

0

Creo que es posible que no esté enrojeciendo después de escribir, por lo que hacer OutputStream.flush() a menudo y leer puede ser un byte en el tiempo, al menos para ver si sus datos están pasando. p. para comenzar con abrir un conducto con nombre en modo de solo lectura (FileInputStream) en proceso1, ábralo en modo de escritura (FileOutputStream) en process2, de modo que todo lo que escriba en process2 se leerá en process1.

también leer

http://www.tldp.org/LDP/lpg/node15.html
http://www.unixguide.net/unix/programming/2.10.5.shtml http://www.unixguide.net/unix/programming/2.10.6.shtml