这是我的另一个问题的后续问题:
Run bat file in Java and wait
我将此作为一个单独的问题发布的原因是我已经问过的问题得到了正确回答.从我的一些研究中我的问题是我的案例所独有的所以我决定创建一个新问题.请继续阅读这个问题,因为它们密切相关.
运行建议的代码会在waitFor调用时阻塞程序.经过一些研究后,我发现waitFor方法会阻止你的进程是否有需要被处理的输出,所以你应该首先清空输出流和错误流.我做了那些事,但我的方法仍然阻止.然后我找到了一个简单循环的建议,在等待exitValue方法返回进程的退出值并处理抛出的异常(如果不是),暂停一小段时间以便不占用所有CPU.我这样做了:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Test {
public static void main(String[] args) {
try {
Process p = Runtime.getRuntime().exec(
"cmd /k start SQLScriptsToRun.bat" + " -UuserName -Ppassword"
+ " projectName");
final BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
final BufferedReader error = new BufferedReader(new InputStreamReader(p.getErrorStream()));
new Thread(new Runnable() {
@Override
public void run() {
try {
while (input.readLine()!=null) {}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
try {
while (error.readLine()!=null) {}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
int i = 0;
boolean finished = false;
while (!finished) {
try {
i = p.exitValue();
finished = true;
} catch (IllegalThreadStateException e) {
e.printStackTrace();
try {
Thread.sleep(500);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
System.out.println(i);
} catch (IOException e) {
e.printStackTrace();
}
}
}
但我的过程不会结束!我一直收到这个错误:
java.lang.IllegalThreadStateException: process has not exited
有关为什么我的流程不会退出的任何想法?或者你有任何库建议处理正确执行批处理文件并等待执行完成?
Java执行批处理文件问题
本文探讨了在Java中执行批处理文件时遇到的问题,包括使用Runtime.getRuntime().exec()方法执行批处理文件后如何正确处理输出流和错误流,以及如何确保进程能够正常结束。
898

被折叠的 条评论
为什么被折叠?



