Java在命令提示符下发出命令

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"

我有下面的类文件。这将启动命令提示符并打印响应。奇怪的是,在第一次打印之后,即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");
        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