У меня есть консольная Java-программа, которая выполняет sh -i
в отдельном процессе и копирует данные между потоком ввода-вывода процессов и соответствующими системными потоками:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
class StreamCopier implements Runnable {
private InputStream in;
private OutputStream out;
public StreamCopier(InputStream in, OutputStream out) {
this.in = in;
this.out = out;
}
public void run() {
try {
int n = 0;
byte[] buffer = new byte[4096];
while (-1 != (n = in.read(buffer))) {
out.write(buffer, 0, n);
out.flush();
}
} catch (IOException e) {
System.out.println(e);
}
}
}
public class Test {
public static void main(String[] args)
throws IOException, InterruptedException {
Process process = Runtime.getRuntime().exec("sh -i");
new Thread(new StreamCopier(
process.getInputStream(), System.out)).start();
new Thread(new StreamCopier(
process.getErrorStream(), System.err)).start();
new Thread(new StreamCopier(
System.in, process.getOutputStream())).start();
process.waitFor();
}
}
Запуск его под Linux приводит к следующему:
$
[1]+ Stopped java -cp . Test
Может кто-нибудь уточнить, почему приложение остановлено и как его избежать?
Это связано с моим вопросом о копировании потоков , но я думаю, что этот конкретный вопрос заслуживает отдельного внимания.