Foros del Web » Programación para mayores de 30 ;) » Java »

Comunicación entre shell, java y codificación

Estas en el tema de Comunicación entre shell, java y codificación en el foro de Java en Foros del Web. Buenas: soy nuevo en este foro, a ver si me podeis ayudar: tenía un binario que ejecutaba desde java en mi shell y recogía los ...
  #1 (permalink)  
Antiguo 18/11/2010, 07:14
 
Fecha de Ingreso: noviembre-2010
Mensajes: 4
Antigüedad: 14 años, 1 mes
Puntos: 0
Pregunta Comunicación entre shell, java y codificación

Buenas:

soy nuevo en este foro, a ver si me podeis ayudar: tenía un binario que ejecutaba desde java en mi shell y recogía los datos de la siguiente forma:
...
comando = "@ absoluta binario"+cadena;
// Ejcutamos el comando
Process p = Runtime.getRuntime().exec(comando);System.out.prin tln(comando);
//recogemos salida
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
...
y me funcionaba a medias, vamos recogía los datos lo único que tenía problemas de codificación entre utf-8 del shell y el iso-8859-1.

Bien, tras esto intenté crearme un script que contuviera este binario, y usaba el comando iconv para transformar mi cadena:
Pasar a latin 1: iconv -f utf-8 -t iso-8859-1
Pasar a utf-8 : iconv -f iso-8859-1 -t utf-8

Una vez echo este script, cambiando el comando, la salida no es recogida entera y no sé por qué, mientras que ejecutándolo en terminal funciona correctamente.Tampoco me funciona la función:
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream(),"UTF-8")); ni
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream(),"ISO-8859-1"));

Si a alguine se le ocurre la forma de recoger esta salida o qué podría hacer para solucionarlo

Muchas gracias de antemano
  #2 (permalink)  
Antiguo 18/11/2010, 08:45
Avatar de nup_  
Fecha de Ingreso: noviembre-2010
Mensajes: 265
Antigüedad: 14 años, 1 mes
Puntos: 32
Respuesta: Comunicación entre shell, java y codificación

Hola:
Puede q el script esté fallando al ejecutarse.
Verifica q no haya ninguna salida por el stream de error del proceso:
BufferedReader stdError = new BufferedReader( new InputStreamReader( p..getErrorStream() ) );

Verifica también q el valor de retorno del proceso es 0, si es diferente de 0 hubo un error en la ejecución:
int resultado = p.waitFor(); //Esto se va a bloquear hasta q el proceso finalice.

slds;

Nup_
  #3 (permalink)  
Antiguo 19/11/2010, 02:47
 
Fecha de Ingreso: noviembre-2010
Mensajes: 4
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Comunicación entre shell, java y codificación

Creo que no hay ningún problema en el script; la salida de errores la tengo controlada, porque lo trato por si acaso, y la salida del proceso me devuelve 0.

Una pregunta que me estoy haciendo es si habrá algún problema para recoger los datos de la salida estándar de un script y pasárselo a un programa java, sabiendo que estos datos después de su ejecución pasan por una tubería; es decir, la útlima línea del script es:

binario parámetros | iconv -f iso-8859-1 -t utf-8

Dicho binario se encuentra en /bin
  #4 (permalink)  
Antiguo 19/11/2010, 08:22
Avatar de nup_  
Fecha de Ingreso: noviembre-2010
Mensajes: 265
Antigüedad: 14 años, 1 mes
Puntos: 32
Respuesta: Comunicación entre shell, java y codificación

Cita:
Iniciado por Rubo83 Ver Mensaje
Una pregunta que me estoy haciendo es si habrá algún problema para recoger los datos de la salida estándar de un script y pasárselo a un programa java, sabiendo que estos datos después de su ejecución pasan por una tubería; es decir, la útlima línea del script es:

binario parámetros | iconv -f iso-8859-1 -t utf-8
Ese no debe ser el problema, si el script envía datos hacia la salida standar estos datos son recogidos por el InputStream, sin importar si los sacó de una tubería o los generó él.

Lo único q se me ocurre ahora es:
- En la ejecución de tu script o de tu binario utilicen alguna variable de entorno q no estén encontrando. Según la doc de la clase Process el subproceso creado no tiene su propia terminal. Si ese el el problema podrías utilizar la clase ProcessBuilder a la q le puedes poner las variables de entorno necesarias.

- Estés demorando mucho para leer las salidas del proceso. Nuevamente la doc de la clase te dice: "... failure to promptly write the input stream or read the output stream of the subprocess may cause the subprocess to block, and even deadlock... "
Prueba utilizar un thread para leer la salida standar y la salida de errores de forma asíncrona.

Sorry q no pueda ser de más ayuda.


slds;

Nup_
  #5 (permalink)  
Antiguo 22/11/2010, 04:56
 
Fecha de Ingreso: noviembre-2010
Mensajes: 4
Antigüedad: 14 años, 1 mes
Puntos: 0
De acuerdo Respuesta: Comunicación entre shell, java y codificación

Por fin he solucionado el problema, ni variables de entorno ni ProcessBuilder, el problema lo tenía en mi script, que para que me hiciera la conversión de utf-8 a latin-8859-1 introducía los argumentos en un string, de forma que las comillas no le gustaban mucho. La solución es introducir los parámetros de entrada como $*. La conversión sería de la siguiente forma:

aux=$(echo $* | iconv -f utf-8 -t iso-8859-1
binario $aux | iconv -f iso-8859-1 -t utf-8
  #6 (permalink)  
Antiguo 22/11/2010, 04:57
 
Fecha de Ingreso: noviembre-2010
Mensajes: 4
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Comunicación entre shell, java y codificación

Se me olvidaba, gracis por todo Nup_

Etiquetas: shell
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:13.