我需要与命令行进程进行交互,例如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");
答案 0 :(得分:3)
因为Diskpart所做的下一件事是显示提示,其中不包含换行符:
Microsoft DiskPart version 6.1.7601
Copyright (C) 1999-2008 Microsoft Corporation.
On computer: PCNAME
DISKPART> _
所以你的代码就在那里等待换行符,它永远不会出现。
您需要更改代码以在适当的时间发送“list disk”命令。
答案 1 :(得分: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
我建议您首先使用标准批处理文件,但要检查输出是否正确。