[?] Dirigir salida bucle hacia comando linux

Iniciado por HardC0d3, 24 Julio 2017, 05:23 AM

0 Miembros y 1 Visitante están viendo este tema.

HardC0d3

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:

Código (java) [Seleccionar]

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.

ivancea96

Casi lo tenías :D!
Código (java) [Seleccionar]
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
Y bueno, el Process tiene estos métodos: 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.

HardC0d3

#2
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:

Código (java) [Seleccionar]

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 !!