gpt4 book ai didi

java - 读取 system.in 时 Runtime.exec 从不返回

转载 作者:行者123 更新时间:2023-12-04 05:37:33 24 4
gpt4 key购买 nike

这是我的示例代码,我想在运行新的子进程时处理来自标准输入的命令。但是,如果我读取 system.in,exec 方法永远不会返回。 exec() 中的命令非常简单,与标准输入无关。

我想知道有没有办法解决这个问题?如何在启动另一个线程读取标准输入的同时启动一个新的子进程?

public static void main(String[] args){
new Thread(new Runnable(){
public void run(){
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String command = null;
try{
while((command = reader.readLine()) != null){
System.out.println("Command Received:" + command);
}
}catch(Exception ex){
ex.printStackTrace();
//failed to listening command
}

}
}).start();
Process process = null;
try {
process = Runtime.getRuntime().exec("java -cp C:/agenttest Test");
System.out.println("never returns");
process.waitFor();
} catch (IOException e) {
throw new RuntimeException( e );
} catch (InterruptedException e) {
throw new RuntimeException( e );
}
}

Test类很简单,这里是Test.java
public static void main(String[] args){
System.out.println("Standard out");
System.out.println("Standard out");
System.err.println("Standard err");
System.out.println("Standard out");
try{
Thread.sleep(10000);
}catch(InterruptedException ex){}
}

最佳答案

问题可能是您没有处理错误流和输入流,并且超出了平台的缓冲区。尝试按照著名文章 When Runtime.exec() won't 处理该输出.

例如:

import java.io.*;

public class TestMain {
private static final String JAVA_CMD = "java";
private static final String CP = "-cp";

// *** your CLASS_PATH and PROG Strings will of course be different ***
private static final String CLASS_PATH = "C:/Users/hovercraft/Documents/workspace/Yr 2012A/bin";
private static final String PROG = "yr12.m07.b.Test2";

private static final String[] CMD_ARRAY = { JAVA_CMD, CP, CLASS_PATH, PROG };

public static void main(String[] args) {
new Thread(new Runnable() {
public void run() {
BufferedReader reader = new BufferedReader(new InputStreamReader(
System.in));
String command = null;
try {
while ((command = reader.readLine()) != null) {
System.out.println("Command Received:" + command);
}
} catch (Exception ex) {
ex.printStackTrace();
// failed to listening command
}

}
}).start();
Process process = null;
try {
ProcessBuilder processBuilder = new ProcessBuilder(CMD_ARRAY);
process = processBuilder.start();
InputStream inputStream = process.getInputStream();
setUpStreamGobbler(inputStream, System.out);

InputStream errorStream = process.getErrorStream();
setUpStreamGobbler(errorStream, System.err);

System.out.println("never returns");
process.waitFor();
} catch (IOException e) {
throw new RuntimeException(e);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}

public static void setUpStreamGobbler(final InputStream is, final PrintStream ps) {
final InputStreamReader streamReader = new InputStreamReader(is);
new Thread(new Runnable() {
public void run() {
BufferedReader br = new BufferedReader(streamReader);
String line = null;
try {
while ((line = br.readLine()) != null) {
ps.println("process stream: " + line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}).start();
}
}

关于java - 读取 system.in 时 Runtime.exec 从不返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11732399/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com