这是对这个问题的跟进。那里的答案建议将进程的输出、错误和输入流复制到系统版本中,使用
然而,生成的代码对于执行“sh -i”命令等交互式进程无效。在后一种情况下,任何“sh”命令都没有响应。
所以我的问题是:你能否建议一种替代方法来复制流,以便与交互式进程一起使用?
IOUtils.copy
,方法如下(在修复各种编译错误后):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();
}
}
然而,生成的代码对于执行“sh -i”命令等交互式进程无效。在后一种情况下,任何“sh”命令都没有响应。
所以我的问题是:你能否建议一种替代方法来复制流,以便与交互式进程一起使用?
IOUtil.copy()
直到流结束时才退出,因此它与您的代码没有太大区别,两者在处理sh
时存在相同的问题。 - vitaut