Java 运行时进程无法在 运行 一组命令后退出并等待其输出
Java Runtime process was unable to exit after running a set of commands and wait for its output
一旦我们从该方法中发出 运行 命令,就无法退出该方法。它卡在 StreamHandler class.
的波纹管代码中
while (bufferedReader.read(cb) > 0) {
cb.flip();
char[] chars = new char[cb.limit()];
cb.get(chars);
System.out.println(new String(chars));
cb.clear();
}
有什么解决方法可以解决这个问题?我使用此方法来执行 运行 组 windows cmd 命令并等待它们执行。我不想看到执行命令的输出。但是我有一个要求,等到所有的命令都执行完,退出这个方法再执行别的。
public synchronized execute_cmd_command(List<String> commandLst) throws IOException, InterruptedException {
Process[] process = {null};
process[0] = Runtime.getRuntime().exec("cmd.exe");
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(process[0].getOutputStream()));
commandLst.stream().forEach(s -> {
try {
bufferedWriter.write(s);
bufferedWriter.newLine();
bufferedWriter.flush();
} catch (IOException e) {
System.out.println(e.getMessage());
e.printStackTrace();
throw new RuntimeException(e);
}
});
StreamHandler streamHandler = new StreamHandler(process[0].getInputStream());
streamHandler.start();
streamHandler.join();
}
流处理程序Class
public class StreamHandler implements Runnable {
private InputStream inputStream;
Thread thread;
public StreamHandler(InputStream inputStream) {
this.inputStream = inputStream;
}
public void start() {
thread = new Thread(this);
thread.start();
}
public void join() throws InterruptedException {
thread.join();
}
@Override
public void run() {
try {
CharBuffer cb = CharBuffer.allocate(256);
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
cb.clear();
while (bufferedReader.read(cb) > 0) {
cb.flip();
char[] chars = new char[cb.limit()];
cb.get(chars);
System.out.println(new String(chars));
cb.clear();
}
} catch (Exception ex) {
ex.printStackTrace();
throw new RuntimeException(ex);
}
}
}
进程的输出挂在“StreamHandler
”class 的“bufferedReader.read(cb) > 0
”行,之后不返回任何内容。
你们能提供一个解决方法吗?
您应该在启动 StreamHandler 线程之前关闭进程[0].getOutputStream()(另外,最好关闭 bufferedWriter):
bufferedWriter.close();
process[0].getOutputStream().close();
bufferedReader.read(cb) 将阻塞直到某些输入可用、发生 I/O 错误或到达流的末尾。
https://docs.oracle.com/javase/7/docs/api/java/io/Reader.html#read(char[])
由于 process[0].getOutputStream() 通过管道传输到进程的输入流,您应该关闭 OutputStream 否则 bufferedReader.read(cb) 将被阻塞。
一旦我们从该方法中发出 运行 命令,就无法退出该方法。它卡在 StreamHandler class.
的波纹管代码中 while (bufferedReader.read(cb) > 0) {
cb.flip();
char[] chars = new char[cb.limit()];
cb.get(chars);
System.out.println(new String(chars));
cb.clear();
}
有什么解决方法可以解决这个问题?我使用此方法来执行 运行 组 windows cmd 命令并等待它们执行。我不想看到执行命令的输出。但是我有一个要求,等到所有的命令都执行完,退出这个方法再执行别的。
public synchronized execute_cmd_command(List<String> commandLst) throws IOException, InterruptedException {
Process[] process = {null};
process[0] = Runtime.getRuntime().exec("cmd.exe");
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(process[0].getOutputStream()));
commandLst.stream().forEach(s -> {
try {
bufferedWriter.write(s);
bufferedWriter.newLine();
bufferedWriter.flush();
} catch (IOException e) {
System.out.println(e.getMessage());
e.printStackTrace();
throw new RuntimeException(e);
}
});
StreamHandler streamHandler = new StreamHandler(process[0].getInputStream());
streamHandler.start();
streamHandler.join();
}
流处理程序Class
public class StreamHandler implements Runnable {
private InputStream inputStream;
Thread thread;
public StreamHandler(InputStream inputStream) {
this.inputStream = inputStream;
}
public void start() {
thread = new Thread(this);
thread.start();
}
public void join() throws InterruptedException {
thread.join();
}
@Override
public void run() {
try {
CharBuffer cb = CharBuffer.allocate(256);
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
cb.clear();
while (bufferedReader.read(cb) > 0) {
cb.flip();
char[] chars = new char[cb.limit()];
cb.get(chars);
System.out.println(new String(chars));
cb.clear();
}
} catch (Exception ex) {
ex.printStackTrace();
throw new RuntimeException(ex);
}
}
}
进程的输出挂在“StreamHandler
”class 的“bufferedReader.read(cb) > 0
”行,之后不返回任何内容。
你们能提供一个解决方法吗?
您应该在启动 StreamHandler 线程之前关闭进程[0].getOutputStream()(另外,最好关闭 bufferedWriter):
bufferedWriter.close();
process[0].getOutputStream().close();
bufferedReader.read(cb) 将阻塞直到某些输入可用、发生 I/O 错误或到达流的末尾。
https://docs.oracle.com/javase/7/docs/api/java/io/Reader.html#read(char[])
由于 process[0].getOutputStream() 通过管道传输到进程的输入流,您应该关闭 OutputStream 否则 bufferedReader.read(cb) 将被阻塞。