0

我需要与命令行进程交互,例如windows 上的diskpart。问题:input.readLine()在以下示例中导致阻塞。

public static void main(String[] args) throws IOException 
{
    ProcessBuilder processBuilder = new ProcessBuilder("C:\\Windows\\system32\\diskpart.exe");                      
    processBuilder.redirectErrorStream(true);
    Process process = processBuilder.start();

    input = new BufferedReader(new InputStreamReader(process.getInputStream()));
    output = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));

    // read #1 code position
    String line = null;
    while((line = input.readLine())!= null)
        System.out.println(line);

    // code position #2
    System.out.println("This line is never executed");   

    output.write("list disk" + System.lineSeparator());
    output.flush(); // important
}

输出(从读取 #1 代码位置)是

Microsoft DiskPart-Version 6.1.7601
Copyright (C) 1999-2008 Microsoft Corporation.
Auf Computer: MYPC

这是正确的,但是在那之后什么也没有发生,例如代码位置#2

System.out.println("This line is never executed"); 

永远达不到。谁能告诉我,为什么以及如何解决这个问题?谢谢!

更新:

尝试逐字节读取似乎也不起作用?):

    InputStreamReader input = new InputStreamReader(process.getInputStream());
    int mychar = -1;

    while((mychar = input.read()) != -1)
        System.out.println(mychar);

    System.out.println("This line is never executed"); 
4

2 回答 2

3

因为 Diskpart 所做的下一件事是显示提示,其中不包含换行符:

Microsoft DiskPart version 6.1.7601
Copyright (C) 1999-2008 Microsoft Corporation.
On computer: PCNAME

DISKPART> _

所以你的代码在那里等待换行,它永远不会出现。

您需要更改代码以在正确的时间发送“list disk”命令。

于 2012-09-02T21:47:15.150 回答
1

Diskpart有一个需要用户输入的交互式控制台。尝试像这样读取它的输出:

while((line = input.readLine())!= null)
      System.out.println(line);

将导致您无限期地等待,因为应用程序本身需要输入。

您需要先等待来自 windows 命令的输入,因此您需要添加CMD /C到命令中。

由于diskpart是交互式的,您可以尝试将 list 命令作为脚本运行,因此您可以:

String[] command = {"CMD", "/C", "C:\\Windows\\system32\\diskpart.exe", "/s", "diskpart.txt"};
ProcessBuilder processBuilder = new ProcessBuilder(command); 

包含diskpart.txt

list disk

我建议您首先在标准批处理文件中使用它以检查输出是否正确。

于 2012-09-02T21:46:52.997 回答