(Java) Redirección de archivos(en ambos sentidos) dentro de Runtime.exec?
redirect execution (1)
A menos que esté enviando un nombre de archivo a la entrada estándar del proceso, no hay distinción de si los datos provienen de un archivo o de cualquier otra fuente de datos.
OutputStream
escribir en el OutputStream
dado por Process.getOutputStream()
. Los datos que escribe le permiten leer desde un archivo utilizando FileInputStream
.
Poner eso juntos podría ser algo como esto:
Process proc = Runtime.getRuntime().exec("...");
OutputStream standardInputOfChildProcess = proc.getOutputStream();
InputStream dataFromFile = new FileInputStream("theFileWithTheData.dat");
byte[] buff = new byte[1024];
for ( int count = -1; (count = dataFromFile.read(buff)) != -1; ) {
standardInputOfChildProcess.write(buff, 0, count);
}
He omitido muchos detalles, esto es solo para entenderlo. Querrá cerrar las cosas de forma segura, quizás desee considerar el almacenamiento en búfer y deberá preocuparse por las trampas de Runtime.exec()
.
Editar
Escribir el resultado en un archivo es similar. Obtenga un FileOutputStream
apunta al archivo de salida y escriba los datos que haya leído de Process.getInputStream()
en ese OutputStream
. La principal advertencia aquí es que debe hacer esta operación en un segundo subproceso, ya que el acceso a dos secuencias de bloqueo del mismo subproceso conducirá a interbloqueo (consulte el artículo anterior).
Quiero ejecutar este comando:
/ceplinux_work3/myName/opt/myCompany/ourProduct/bin/EXECUTE_THIS -p cepamd64linux.myCompany.com:19021/ws1/project_name < /ceplinux_work3/myName/stressting/Publisher/uploadable/00000.bin >> /ceplinux_work3/myName/stressting/Publisher/stats/ws1.project_name.19021/2011-07-22T12-45-20_PID-2237/out.up
Pero no funciona porque EXECUTE_THIS requiere un archivo de entrada a través de la redirección, y simplemente pasar este comando a Runtime.exec no funciona.
Nota al margen: busqué todo sobre cómo resolver esto antes de venir aquí para preguntar. Hay muchas preguntas / artículos en la web sobre Runtime.exec y la redirección de entrada / salida. Sin embargo, no puedo encontrar ninguno que se ocupe de pasar un archivo a un comando y enviar el resultado a otro archivo. Además, no estoy totalmente familiarizado con las transmisiones de Entrada / Salida, así que me cuesta mucho reunir toda la información para mi situación específica.
Dicho esto, cualquier ayuda es muy apreciada.
PD: Si hay varias formas de hacerlo, prefiero lo que sea más rápido en términos de rendimiento.
Editar: como se discutió en mi última pregunta, NO PUEDO cambiar esto a una llamada bash porque el programa debe esperar a que este proceso finalice antes de continuar.