Eclipse 使用java.lang.ProcessBuilder
我从一个java应用程序运行一个bat文件,该文件启动另一个java应用程序:Eclipse 使用java.lang.ProcessBuilder,eclipse,process,Eclipse,Process,我从一个java应用程序运行一个bat文件,该文件启动另一个java应用程序: ProcessBuilder processBuilder = new ProcessBuilder("path to bat file"); Process process = processBuilder.start(); 但这个过程从未开始,也没有错误被打印出来。但如果我加上一行: String resultString = convertStreamToString(process.getInp
ProcessBuilder processBuilder = new ProcessBuilder("path to bat file");
Process process = processBuilder.start();
但这个过程从未开始,也没有错误被打印出来。但如果我加上一行:
String resultString = convertStreamToString(process.getInputStream());
之后:Process Process=processBuilder.start
其中:
public String convertStreamToString(InputStream is) throws IOException {
/*
* To convert the InputStream to String we use the Reader.read(char[]
* buffer) method. We iterate until the Reader return -1 which means there's
* no more data to read. We use the StringWriter class to produce the
* string.
*/
if (is != null) {
Writer writer = new StringWriter();
char[] buffer = new char[1024];
try {
Reader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
int n;
while ((n = reader.read(buffer)) != -1) {
writer.write(buffer, 0, n);
}
} finally {
is.close();
}
return writer.toString();
} else {
return "";
} }
它跑得很好!有什么想法吗?如果它确实是一个批处理文件,您应该以进程的形式运行命令行解释器,例如cmd.exe,并将该文件作为参数。解决方法如下: 但是,仅供参考,子进程有一个有限的输出缓冲区,因此如果您不从中读取,它们将挂起等待写入更多IO。您在原始文章中的示例通过继续读取进程的输出流来正确地解决这个问题,这样它就不会挂起
链接到的文章演示了一种从流中读取数据的方法。但关键的附加概念是,您必须不断读取子进程的输出/错误,以防止它因I/O阻塞而挂起。您需要使用标准输入/输入流与该进程通信吗?您的意思是这样的:ProcessBuilder pb=new ProcessBuilder cmd,/c,mybat.bat,param 1,param 2,param 3;我已经试过了,但是它给出了相同的结果。你是如何检查进程没有运行的,ProcessExplorer,Java控制台?