我正在编写一个Java程序,使用ProcessBuilder
运行批处理文件。
public class Test {
public static void main(String[] args){
try {
ProcessBuilder processBuilder = new ProcessBuilder("pathToMyBatch.bat");
Process process = processBuilder.start();
StreamReader fluxSortie = new StreamReader(process.getInputStream());
StreamReader fluxErreur = new StreamReader(process.getErrorStream());
new Thread(fluxSortie).start();
new Thread(fluxErreur).start();
} catch (IOException e) {
e.printStackTrace();
}
}
static class StreamReader implements Runnable {
private final InputStream inputStream;
StreamReader(InputStream inputStream) {
this.inputStream = inputStream;
}
private BufferedReader getBufferedReader(InputStream is) {
return new BufferedReader(new InputStreamReader(is));
}
@Override
public void run() {
BufferedReader br = getBufferedReader(inputStream);
String ligne = "";
try {
while ((ligne = br.readLine()) != null) {
System.out.println(ligne);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
StreamReader
类是一个可运行类,它等待输入并打印每个读取的行。
批处理文件通过调用java -classpath...
启动另一个Java应用程序,并执行与该应用程序相关(和不相关)的其他任务。
我无法修改这个批处理文件。
为了让问题清晰明确:程序A
启动批处理文件B
,然后批处理文件B
启动应用程序C
当我直接从Windows运行批处理文件B
时,Java应用程序C
几乎不使用超过2%的CPU。但是当我通过我的Java程序A
运行时,C
使用了25%的CPU负载(1个完整的核心)。无论哪种情况,批处理执行对CPU的负荷约为0%。
我猜测这是由于Java应用程序的输出和错误流没有被正确处理导致的。
我是正确的吗?我该如何解决这个问题?有没有办法获取子进程(进程的子级)进程流?
C
只写了大约20行。如果我删除println
,我会遇到同样的问题。@John 你是什么意思? - jhamon