Ejecución de un progtwig externo con stdin y stdout redirigidos desde Java

Estoy intentando ejecutar un progtwig externo desde un progtwig Java y estoy teniendo problemas. Básicamente lo que me gustaría hacer sería esto:

Runtime.getRuntime().exec("./extprogram fileOut"); 

Sin embargo, he encontrado que eso no funciona: Java aparente necesita utilizar un Process con flujos de entrada y salida y otras cosas con las que no tengo experiencia.

He visto varios ejemplos en Internet (muchos de ellos son de SO), y no parece haber una forma estándar simple de hacerlo, que para alguien que no comprende completamente lo que está sucediendo, puede ser bastante frustrante

También estoy teniendo problemas para tratar de crear mi propio código a partir de los ejemplos del código de otras personas, porque en general parece que la mayoría de las personas 1. no están interesadas en redirigir stdin , y 2. no están necesariamente redirigiendo stdout a un archivo, pero en cambio a System.out .

Entonces, ¿alguien podría apuntarme en la dirección de cualquier plantilla de código simple y buena para llamar a progtwigs externos y redirigir stdin y stdout ? Gracias.

Si debe usar Process , entonces algo como esto debería funcionar:

 public static void pipeStream(InputStream input, OutputStream output) throws IOException { byte buffer[] = new byte[1024]; int numRead = 0; do { numRead = input.read(buffer); output.write(buffer, 0, numRead); } while (input.available() > 0); output.flush(); } public static void main(String[] argv) { FileInputStream fileIn = null; FileOutputStream fileOut = null; OutputStream procIn = null; InputStream procOut = null; try { fileIn = new FileInputStream("test.txt"); fileOut = new FileOutputStream("testOut.txt"); Process process = Runtime.getRuntime().exec ("/bin/cat"); procIn = process.getOutputStream(); procOut = process.getInputStream(); pipeStream(fileIn, procIn); pipeStream(procOut, fileOut); } catch (IOException ioe) { System.out.println(ioe); } } 

Nota:

  • Asegúrate de close las transmisiones
  • Cambie esto para usar secuencias almacenadas en búfer, creo que la implementación Raw Input/OutputStreams puede copiar un byte a la vez.
  • El manejo del proceso probablemente cambiará dependiendo de su proceso específico: cat es el ejemplo más simple con E / S por tubería.

Podrías probar algo como esto:

 ProcessBuilder pb = new ProcessBuilder(); pb.redirectInput(new FileInputStream(new File(infile)); pb.redirectOutput(new FileOutputStream(new File(outfile)); pb.command(cmd); pb.start().waitFor(); 

¿Has probado System.setIn y System.setOut? ha estado presente desde JDK 1.0.

 public class MyClass { System.setIn( new FileInputStream( "fileIn.txt" ) ); int oneByte = (char) System.in.read(); ... System.setOut( new FileOutputStream( "fileOut.txt" ) ); ...