To jest kontynuacja do this question. Odpowiedź sugerowane jestJak skopiować strumienie wejściowe/wyjściowe procesu do ich odpowiedników systemowych?
skopiować proces out, err, a strumienie wejściowe do wersji systemu
z IOUtils.copy
następująco (po utrwaleniu różne błędy kompilacji):
import org.apache.commons.io.IOUtils;
import java.io.IOException;
public class Test {
public static void main(String[] args)
throws IOException, InterruptedException {
final Process process = Runtime.getRuntime().exec("/bin/sh -i");
new Thread(new Runnable() {public void run() {
try {
IOUtils.copy(process.getInputStream(), System.out);
} catch (IOException e) {}
} }).start();
new Thread(new Runnable() {public void run() {
try {
IOUtils.copy(process.getErrorStream(), System.err);
} catch (IOException e) {}
} }).start();
new Thread(new Runnable() {public void run() {
try {
IOUtils.copy(System.in, process.getOutputStream());
} catch (IOException e) {}
} }).start();
process.waitFor();
}
}
Jednak wynikowy kod nie działa w przypadku procesów interaktywnych, takich jak wykonujące polecenie sh -i
. W tym ostatnim przypadku nie ma odpowiedzi na żadne z poleceń sh
.
Moje pytanie brzmi: czy mógłbyś zaproponować alternatywę dla kopiowania strumieni, które będą działać z procesami interaktywnymi?
Dzięki za sugestię. Jednak 'IOUtil.copy()' nie kończy się, dopóki nie zostanie osiągnięty koniec strumienia, więc nie różni się on od twojego kodu, który ma takie same problemy z 'sh'. – vitaut
Pls zapoznaj się z tym http://stackoverflow.com/questions/804951/is-it-possible-to-read-from-a-java-inputstream-with-a-timeout/808795#808795 –