1、修改Java程序,标准输出流与错误输出流均要处理,保证输出缓冲区不会被堵住。具体作法是用一个异步线程读取标准输出,读完即扔,让主线程读取错误输出流:
下面是一个使用ProcessBuilder来执行外部命令并处理输入、输出和错误流的示例代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class ProcessBuilderExample {
public static void main(String[] args) throws IOException {
ProcessBuilder processBuilder = new ProcessBuilder("cmd.exe", "/c", "backup_script.bat");
processBuilder.redirectErrorStream(true); // 将错误流合并到标准输出流
Process process = processBuilder.start();
// 读取命令的输出
InputStream inputStream = process.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
// 等待命令执行完成
try {
int exitCode = process.waitFor();
System.out.println("Command executed with exit code " + exitCode);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
但是程序还是会卡住!!!
2、如果即使处理了输入流和错误流,程序仍然会卡住,可能是由于外部命令的输出或错误流没有被完全处理导致的。在这种情况下,你可以使用线程来异步处理外部命令的输出和错误流,从而避免阻塞主线程。
下面是一个使用ProcessBuilder和线程来执行外部命令并异步处理输入、输出和错误流的示例代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class ProcessBuilderExample {
public static void main(String[] args) throws IOException {
ProcessBuilder processBuilder = new ProcessBuilder("cmd.exe", "/c", "backup_script.bat");
processBuilder.redirectErrorStream(true); // 将错误流合并到标准输出流
Process process = processBuilder.start();
// 创建一个线程来处理命令的输出和错误流
Thread outputThread = new Thread(() -> {
try {
// 读取命令的输出和错误流
InputStream inputStream = process.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
});
outputThread.start();
// 等待命令执行完成
try {
int exitCode = process.waitFor();
System.out.println("Command executed with exit code " + exitCode);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
在上面的示例中,我们创建了一个新的线程来处理外部命令的输出和错误流,这样可以避免阻塞主线程。希望这个方法可以解决你遇到的程序卡住的问题。
问题解决!!!!!
博客主要围绕Java程序执行外部命令时出现的卡住问题展开。指出要处理标准输出流与错误输出流,避免输出缓冲区堵塞,若处理后仍卡住,可使用线程异步处理外部命令的输出和错误流,避免阻塞主线程,最终解决了程序卡住问题。

866

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



