Java在命令提示符下发出命令
我有下面的类文件。这将启动命令提示符并打印响应。奇怪的是,在第一次打印之后,即dir之后,后续的不打印。请给我一些建议Java在命令提示符下发出命令,java,Java,我有下面的类文件。这将启动命令提示符并打印响应。奇怪的是,在第一次打印之后,即dir之后,后续的不打印。请给我一些建议 import java.io.*; public class JavaApplication14 { static Process p; public static void main(String[] args) { try { String line; p = Runtime.getRuntime().exec("cmd.exe"
import java.io.*;
public class JavaApplication14 {
static Process p;
public static void main(String[] args) {
try {
String line;
p = Runtime.getRuntime().exec("cmd.exe");
OutputStream stdin = p.getOutputStream();
InputStream stderr = p.getErrorStream();
InputStream stdout = p.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(stdout));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin));
String input = "dir";
input += "\n";
writer.write(input);
writer.flush();
while ((line = reader.readLine()) != null) {
System.out.println("Stdout: " + line);
}
input = "cd..";
input += "\n";
writer.write(input);
writer.flush();
input = "dir";
input += "\n";
writer.write(input);
writer.close();
while ((line = reader.readLine()) != null) {
System.out.println("Stdout: " + line);
}
} catch (IOException ex) {
Logger.getLogger(JavaApplication14.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
您的(第一个)while()
循环永远不会终止:
while ((line = reader.readLine()) != null) {
System.out.println("Stdout: " + line);
}
readLine()
在流关闭时返回null
,但由于子进程仍在运行,因此流永远不会关闭
要解决这个问题,您可以将读取部分移动到单独的线程中(这需要额外的同步),或者更简单的解决方案是查看是否读取了特定的行内容,例如,如果命令行提示符是由cmd.exe
打印的:
while ( !(line = reader.readLine()).startsWith("C:\\") ) {
System.out.println("Stdout: " + line);
}
这应该适用于您的特定用例,并且可能足以进行一些学习-对于实际应用程序,您可能希望了解该项目。您正在尝试使用同步I/O操作从一个线程执行基本异步工作。你的方法注定要失败 具体来说,
readLine()
阻塞,直到有完整的行要读取,或者直到底层流关闭
您必须编写更多的代码,包括线程,才能使这项工作正常进行。这是Java中的一个难点
您还可以使用
ProcessBuilder
,尤其是参数值为INHERIT
的redirectOutput
方法,使子进程继承主进程的stdout
。在这种情况下,您将没有机会用Java分析子流程的输出。代码中没有重复dir
ing的循环。你用行
做什么?它似乎只是简单地读取,但没有在任何地方使用。在有更多输入之前,readLine()
总是有阻塞的危险。@MarkoTopolnik Right-就个人而言,我会使用线程方法,但正如您所写,“…这是Java中的一个痛点…”+1