Pregunta

Tengo una cadena que necesito tubo en un programa externo, a continuación, lea la parte posterior de salida. Entiendo cómo leer la parte posterior de salida, pero ¿cómo puedo tubería esta cadena como entrada? Gracias!

¿Fue útil?

Solución

cuidado de que no se crea un punto muerto. Lectura / escritura para el proceso de la misma rosca puede ser problemático si el proceso está escribiendo datos que no están leyendo y mientras tanto se están escribiendo datos no está leyendo.

Yo tiendo a usar una pequeña línea patrón de esto para conseguir el io ir en diferentes temas:

import java.io.InputStream;
import java.io.OutputStream;

public final class Pipe implements Runnable {

    private final InputStream in;
    private final OutputStream out;

    public Pipe(InputStream in, OutputStream out) {
        this.in = in;
        this.out = out;
    }

    public static void pipe(Process process) {
        pipe(process.getInputStream(), System.out);
        pipe(process.getErrorStream(), System.err);
        pipe(System.in, process.getOutputStream());
    }

    public static void pipe(InputStream in, OutputStream out) {
        final Thread thread = new Thread(new Pipe(in, out));
        thread.setDaemon(true);
        thread.start();
    }

    public void run() {
        try {
            int i = -1;

            byte[] buf = new byte[1024];

            while ((i = in.read(buf)) != -1) {
                out.write(buf, 0, i);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Esto puede o no aplicarse a lo que quieres hacer - tal vez su trato con un conjunto establecido de entrada que está garantizado para aparecer después de cierta salida esperada (o viceversa, o varias iteraciones de eso). Es decir. algunos síncrono bloque y paso tipo de interacción.

Sin embargo, si usted es simplemente 'observando' para algo que podría aparecer entonces este es un buen comienzo en la dirección correcta. Se podría pasar en algunos diferentes flujos de trabajo y de alguna 'Await (largo, TimeUnit)' código de tipo java.util.concurrent de espera de la respuesta. Java IO bloques básicamente siempre en lectura () de operaciones, por lo que separa a sí mismo de esos hilos le permitirá renunciar después de un cierto tiempo si no obtiene la respuesta esperada del proceso externo.

Otros consejos

Dice así (sin compilar y no probado)

Process p = Runtime . getRuntime ( ) . exec ( ... ) ;
Writer w = new java . io . OutputStreamWriter ( p . getOutputStream ( ) ) ;
w . append ( yourString ) ;
w. flush ( ) ;
// read the input back
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top