Joh*_*eek 28 java io pipe process
如果我通过Java的ProcessBuilder类启动一个进程,我可以完全访问该进程的标准输入,标准输出和标准错误流,如Java InputStreams和OutputStreams.不过,我不能找到一种方法,这些流无缝连接System.in,System.out和System.err.
可以用来redirectErrorStream()获取InputStream包含子进程的标准输出和标准错误的单个,然后循环遍历并通过我的标准输出 - 但是我找不到这样做的方法并让用户键入进程,如果我使用C system()调用他或她可以.
这在Java SE 7出现时似乎是可能的 - 我只是想知道现在是否有解决方法.如果isatty()子进程的结果通过重定向,则奖励积分.
Joh*_*her 16
您需要将Process out,err和输入流复制到System版本.最简单的方法是使用Commons IO软件包中的IOUtils类.该复制方法看起来是你需要的.复制方法调用需要在单独的线程中.
这是基本代码:
// Assume you already have a processBuilder all configured and ready to go
final Process process = processBuilder.start();
new Thread(new Runnable() {public void run() {
IOUtils.copy(process.getOutputStream(), System.out);
} } ).start();
new Thread(new Runnable() {public void run() {
IOUtils.copy(process.getErrorStream(), System.err);
} } ).start();
new Thread(new Runnable() {public void run() {
IOUtils.copy(System.in, process.getInputStream());
} } ).start();
Run Code Online (Sandbox Code Playgroud)
Eel*_*lco 13
John的答案的变体,编译并且不要求您使用Commons IO:
private static void pipeOutput(Process process) {
pipe(process.getErrorStream(), System.err);
pipe(process.getInputStream(), System.out);
}
private static void pipe(final InputStream src, final PrintStream dest) {
new Thread(new Runnable() {
public void run() {
try {
byte[] buffer = new byte[1024];
for (int n = 0; n != -1; n = src.read(buffer)) {
dest.write(buffer, 0, n);
}
} catch (IOException e) { // just exit
}
}
}).start();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12572 次 |
| 最近记录: |