Ich habe ein Problem mit einigen Prozess-Wrapping, und es tritt nur in Windows XP. Dieser Code funktioniert perfekt in Windows 7. Ich bin wirklich ratlos, warum die Streams in XP leer sind. Ich habe auch versucht, die String [] Version von Process.Exec() zu verwenden, und es machte keinen Unterschied.Java process.getInputStream() hat nichts zu lesen, Deadlocks Kind
ich die folgende Klasse verwenden aus dem Prozess STDOUT und STDERR (für jeden Strom eine Instanz) zu lesen:
import java.util.*;
import java.io.*;
public class ThreadedStreamReader extends Thread{
InputStream in;
Queue messageQueue;
public ThreadedStreamReader(InputStream s, Queue q)
{
in = s;
messageQueue = q;
}
public void run()
{
try
{
BufferedReader r = new BufferedReader(new InputStreamReader(in));
String line = null;
while((line = r.readLine()) != null)
{
synchronized(messageQueue)
{
messageQueue.add(line);
}
}
}catch(Exception e)
{
System.err.println("Bad things happened while reading from a stream");
}
}
}
Und ich benutze es hier:
Process p = Runtime.getRuntime().exec("test.exe");
Queue<String> q = new LinkedList<String>();
ThreadedStreamReader stdout = new ThreadedStreamReader(p.getInputStream(), q);
ThreadedStreamReader stderr = new ThreadedStreamReader(p.getErrorStream(), q);
stdout.start();
stderr.start();
while(true)
{
while(q.size() > 0)
{
System.out.println(q.remove());
}
}
Wer noch keine Ideen? Vielen Dank!
Edit: Hinzugefügt Synchronisation
Edit: Gerade als Update werden die Eltern Stream Leser blockiert auf ihre Leseoperation. Wenn ich die untergeordneten Prozesse mit dem Task-Manager abbringe, lesen sie die Null vom Schließen des Streams.
+1 für eine gute detaillierte Frage, die zeigt, dass Sie die möglichen Probleme, die hier entstehen könnten, durchdacht haben. –
Nachdem ich hier im Internet nach Antworten gesucht habe, stolperte ich zufällig über das Problem. Ich habe die Lösung nicht gefunden, nur ein Workaround, aber zumindest bin ich am Laufen. Einer der Parameter, die ich an das Programm übergeben habe, ließ es hängen. Ich nahm den Parameter heraus, der für das, was ich versuche, nicht optimal war, aber das Programm hängt nicht mehr. Derselbe Parameter funktionierte auf meiner Win7-Box, also glaubte ich nicht einmal, dass das ein Teil davon war. Na gut, danke für die Hilfe! – Banana
Welche Art von Parameter haben Sie entfernt? Ich hatte einige seltsame und dumme Probleme mit Deadlocks in Java (alle hatten eines gemeinsam: Lesen von System.in) –