Buenas foro !!
Estoy haciendo una aplicación en Java que corre sobre Linux y no se como implementar la siguiente parte, a ver si me pueden orientar:
Me gustaría que al generar una serie de palabras dentro de un bucle, éstas se pasaran a través de un pipe hacia un comando en Linux ( palabra1 | wc -c ), de forma que "wc -c" tratara con cada una de esas palabras, por ejemplo:
String nombre = "pepito";
for( int i = 0; i < 100; i++ ){
System.out.println( nombre+i ); //hacia---> | wc -c
}
Lo he intentado con "Runtime.getRuntime().exec(comando)" dentro del bucle pero ni funciona ni es eficiente (o algo hago mal), a demás, que creo que estaría ejecutando el comando tantas veces como se repite el bucle y no sería apropiado. ¿Habría que usar BufferedOutputStream o algo similar?
Gracias de antemano.
Casi lo tenías :D!
Runtime.getRuntime().exec()
El método exec retorna un Process. Lo puedes ver aquí: https://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html (https://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html)
Y bueno, el Process tiene estos métodos: https://docs.oracle.com/javase/7/docs/api/java/lang/Process.html (https://docs.oracle.com/javase/7/docs/api/java/lang/Process.html)
Te interesan los métodos getInputStream y getOutputStream. Una vez tengas el outputStream de tu primer proceso y el inputStream del segundo, puedes leer del input y escribirlo en el output.
Y luego supongo que querrás coger el output del segundo proceso para analizarlo o lo que quieras hacer con él.
En principio, así debería funcionar. Nunca hice esto en Java, así que si hay algún problema, coméntalo.
Gracias por responder ivancea96 !!
He seguido tus consejos y después de 4 largas horas me ha salido ;-) , ¡¡que subidón llevo joder jaja !!
Bueno, al final ha quedado así la cosa:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.IOException;
public class SalidaBucleAComando{
public static void main(String[] args) {
String[] animal = {"gato", "perro", "trige", "leon"};
Process echo;
Process wc;
BufferedReader echoOut;
BufferedReader wcOut;
BufferedWriter wcIn;
for( int i = 0; i < animal.length; i++ ){
for( int j = 0; j < 100; j++ ){ // A CADA ANIMAL LE ASIGNO 100 NUMEROS
try {
echo = Runtime.getRuntime().exec("echo "+animal[i]+j);
wc = Runtime.getRuntime().exec("wc -c");
// FLUJO DE SALIDA DEL COMANDO ECHO
echoOut = new BufferedReader(new InputStreamReader(echo.getInputStream()));
// FLUJO DE SALIDA Y DE ENTRADA DEL COMANDO WC
wcOut = new BufferedReader(new InputStreamReader(wc.getInputStream()));
wcIn = new BufferedWriter(new OutputStreamWriter(wc.getOutputStream()));
// ESCRIBO EN LA ENTRADA DE WC LA SALIDA QUE ME DA ECHO ( -> ECHO X | WC -C )
wcIn.write(echoOut.readLine());
wcIn.close(); // CIERRO FLUJO DE ESCRITURA
System.out.println(wcOut.readLine()); // IMPRIMO RESULTADO DE "ECHO X | WC -C"
} catch (IOException e) {
System.out.println("Error al ejecutar");
System.exit(-1);
}
}
}
System.exit(0);
}
}
Gracias de nuevo !!