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程序时,有时候我们需要调用其他的诸如exe,shell这样的程序或脚本。在Java中提供了两种方法来启动其他程序:(1) 使用Runtime的exec()方法(2) 使用ProcessBuilder的start()方法Runtime和ProcessBulider提供了不同的方式来启动程序,设置启动参数、环境变量和工作目录。但是这两种方法都会返回一个用于管理操作系统进程的Process...
1. Runtime.getRuntime()可以取得当前JVM的运行时环境,这也是在Java中唯一一个得到运行时环境的方法
2. Runtime中的exit方法是退出JVM
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.
ProcessBuilder processBuilder = new ProcessBuilder("ps");
processBuilder.redirectErrorStream(true);
Process process = processBuilder.start();
processBuilder.start()会立刻返回,不会待ps进程结束。所...
运行java jar包 运行一段时间后 可能应用在运行时,会出现卡住,前端页面触发不了后端接口的情况)你在 日志输出的页面按一下回车或者在控制台内部鼠标右键又可以继续执行,但是这种情况解决不了以上问题,隔一会后,还是会出现应用卡住问题。默认开启了“快速编辑模式”,只要当鼠标点击cmd任何区域时,就自动进入了编辑模式,之后的程序向控制台输入内容甚至后台的程序都会被阻塞。再次尝试应用运行,测试长时间运用后,应用卡住问题已经不会出现,本次问题已经解决了。解决方案:将cmd默认开启了“快速编辑模式”给去掉。
在Java开发中,有时候需要与操作系统的命令行交互,执行特定的CMD命令或脚本。然而,处理编码问题是调用CMD命令时常遇到的挑战。正确处理编码可以避免输出结果的乱码,确保程序的稳定运行。本文将介绍Java中调用CMD命令的方法,并重点解决编码问题,同时提供一些实用技巧和注意事项。