Frage

Ich habe eine JAR-Datei, die diesen Code ausgeführt wird:

public class InputOutput {

    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        boolean cont = true;
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        while (cont) {
            System.out.print("Input something: ");
            String temp = in.readLine();
            if (temp.equals("end")) {
                cont = false;
                System.out.println("Terminated.");
            }
            else
                System.out.println(temp);
        }
    }
}

Ich möchte eine andere Java-Klasse programmieren, die diese JAR-Datei ausführt, und kann die Eingabe erhalten und die Ausgabe an sie senden. Ist es möglich? Der aktuelle Code, den ich habe, ist dies aber nicht funktioniert:

public class JarTest {

    /**
     * Test input and output of jar files
     * @author Jack
     */
    public static void main(String[] args) {
        try {
            Process io = Runtime.getRuntime().exec("java -jar InputOutput.jar");
            BufferedReader in = new BufferedReader(new InputStreamReader(io.getInputStream()));
            OutputStreamWriter out = new OutputStreamWriter(io.getOutputStream());
            boolean cont = true;
            BufferedReader consolein = new BufferedReader(new InputStreamReader(System.in));
            while (cont) {
                String temp = consolein.readLine();
                out.write(temp);
                System.out.println(in.readLine());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

Danke für Ihre Hilfe

War es hilfreich?

Lösung

Runtime.exec Verwendung ist plattformabhängig.

Wenn Sie Windows verwenden versuchen voranstellen:

cmd /c

java -jar .... etc. et

So etwas wie:

...getRuntime().exec("cmd /c java -jar InputOutput.... 

Sehen Sie das auch: Systemaufruf und stdout Ausgabe zurück.

Andere Tipps

Sie benötigen die JAR-Datei in einem anderen Prozess laufen zu lassen? Wenn nicht, können Sie ein Java-Programm schreiben, das InputOutput.main () aufruft. Alternativ kann, wenn der Name der jar / Klasse nur zur Laufzeit bekannt ist, können Sie eine neue Klasse-Loader erstellen, laden Sie die die Klasse und rufen main () über Reflexion.

Wie für die Umleitung von Ein- / Ausgabeströme können Sie System.setOut, SetIn, setErr verwenden.

Nun, da Sie gesagt, dass Sie sie brauchen in einem anderen Prozess zu laufen, hier ist das Problem mit Ihrem ursprünglichen Code: Sie haben einen Deadlock

.

der Prozess, den Sie starten beginnt zu laufen und schnell füllt seinen Ausgang und Fehlerströme. JarTest muss regelmäßig ihren Inhalt lesen. Da Sie es auf einem einzigen Thread früher oder später dieses Themas finden sich tun warten auf Daten auf einer der Ströme zur Verfügung stehen. An diesem Punkt gibt es niemanden, um Daten aus dem anderen Strom zu sammeln.

Daher sollten Sie dedizierte Threads starten Daten aus dem Standard-Streams des anderen Prozesses zu sammeln.

Informationen die Sie benötigen Alles über Prozess Eingabe / Ausgabe-Threading sind hier enthalten: Link

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top