La salida de Java del generador de procesos se sobrescribe al usar BufferedReader

Estoy tratando de ejecutar un programa externo en Java y leer la salida. El programa es una aplicación de Linux en C ++ que ejecuta un algoritmo de minería de datos e imprime los patrones encontrados en la salida estándar. Quiero poder leer esa salida de mi aplicación Java y mostrar los patrones usando una tabla. El problema es que el tamaño de la salida es bastante grande (como prueba produce 6.5MB en aproximadamente 30 segundos). Estoy usando ProcessBuilder y leo la salida usando un InputStreamReader almacenado en un búfer utilizando un BufferedReader como puede ver en el siguiente código:

      String[] cmd = {"./clogen_periodic", selected, support, "-t 4"};
      Process p = new ProcessBuilder(cmd).start();
      input = new BufferedReader (new InputStreamReader(p.getInputStream()));

      while ((line = input.readLine()) != null) {
         ...
         process line;
         ...
      }

El problema es que la salida se corrompe. Cuando ejecuto el mismo programa en una consola, la salida es correcta, pero cuando uso la aplicación Java, algunas líneas se fusionan. La salida más precisa debería ser así

      TMEmulation log_pseduo_allocation (34985) (2 45 76 89 90)
      __divw clock timer (8273) (4 6 67 4 2)

pero es asi

      TMEmulation log_pseduo_allocation (34985) (2__divw 45clock 76timer (89 8273) 904) (6 67 4 2)

¿Alguna idea sobre el posible problema?

Muchas gracias de antemano, Patricia

Respuesta 1

Intente llamar en el programa C ++, setvbufcon la opción _IOLBF. El final de la tubería expuesta a C ++ probablemente no tiene búfer, mientras que cuando ejecuta los programas desde la línea de comandos |, está búfer de línea.

Respuesta: 2

Si está haciendo un System.out.print () o lo que sea para depurar en cada iteración actualmente, intente poner todas las líneas de todas las iteraciones en una Cadena y pruébelo.

Tal vez su método de salida se imprime de forma asíncrona. Por lo tanto, su salida impresa puede estar dañada pero no la que obtuvo del flujo de entrada.

Solo una idea ...

Respuesta: 3

El siguiente código se compiló correctamente aquí https://www.compilejava.net/ pero la ejecución falla Error: no se pudo encontrar o cargar la clase principal ClassDemo mientras que tiene un punto de entrada principal. Por qué ? ...

Sé que esto se ha preguntado y respondido mucho, pero todavía no tengo una buena solución y todavía no entiendo algunas partes. Así que tengo el requisito de compilar archivos * .java mediante programación. ...

Tengo una clase con un montón de campos, todos privados (subclases acceden a algunos con getters protegidos). Necesito pasar la mayoría de esos campos a un método en otra clase que los formatee y ...

Me gustaría llamar a un método definido como <T> void foo (Class <? Extend Collection <T>>) pero no hay forma de que el compilador me deje pasar foo (ArrayList <Integer> .class); Cuál es el ...