0

Windows の diskpart など、コマンド ライン プロセスと対話する必要があります。問題:input.readLine()次のサンプルでは、​​ブロッキング while が発生します。

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 に答える