开始与继承标准输入/输出Java 6中
问题描述:
/标准错误的过程。如果我开始通过Java的ProcessBuilder类的过程,我有充分的机会来在这一过程中的标准,标准出来,如Java InputStreams
和OutputStreams
标准错误流。但是,我找不到将这些流无缝连接到System.in
,System.out
和System.err
的方法。开始与继承标准输入/输出Java 6中
它可以使用redirectErrorStream()
获取包含子进程的标准出单InputStream
和标准错误,并通过刚刚循环,并通过我的标准把它发送出去,但我不能找到一个方法来做到这一点,让用户键入流程,如果我使用C system()
呼叫,他/她可以。
在Java SE 7出现时,这似乎是可行的 - 我只是想知道现在是否有解决方法。如果子进程中的isatty()
的结果进行重定向,则为积分。
答
您需要将Process out,err和输入流复制到系统版本。最简单的方法是使用Commons IO软件包中的IOUtils类。 copy method看起来是你所需要的。复制方法调用将需要位于不同的线程中。
这是基本的代码:
// 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();
答
,编译,并且不要求您使用共享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();
}
答
对于System.in
使用以下pipein()
,而不是pipe()
pipein(System.in, p.getOutputStream());
执行:
private static void pipein(final InputStream src, final OutputStream dest) {
new Thread(new Runnable() {
public void run() {
try {
int ret = -1;
while ((ret = System.in.read()) != -1) {
dest.write(ret);
dest.flush();
}
} catch (IOException e) { // just exit
}
}
}).start();
}
对不起,我忍不住。 – jjnguy 2008-09-13 04:33:04
没问题。 (顺便说一句,我不是那个低头赞扬你的人。) – 2008-09-13 04:35:08
恩,好吧,谢谢那个不赞成我的人。谢谢你,约翰不要低估我。 – jjnguy 2008-09-13 04:37:54