1

いくつかの簡単なコマンドを使用して、Windows コマンド プロンプト用の Java GUI を作成しようとしています。追加の入力に問題があります。「dir」コマンドを実行できますが、「del」コマンドを実行するときに確認を行う必要がありますが、確認メッセージを出力できないようです。

public static void main(String args[])
{
    try {
        Process p = Runtime.getRuntime().exec("cmd /c dir");
        read(p);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private static void read(Process p)
{
    try{
        BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line = null;
        while((line=input.readLine()) != null) {
            System.out.println(line);
        }   
    }
    catch(IOException e1) { e1.printStackTrace(); }
}

出力:

 Volume in drive E has no label.
 Volume Serial Number is E9ED-7E32

 Directory of E:\Code\workspace\Project

04/11/2012  11:07 PM    <DIR>          .
04/11/2012  11:07 PM    <DIR>          ..
04/11/2012  09:53 PM               301 .classpath
04/11/2012  09:53 PM               383 .project
04/11/2012  09:53 PM    <DIR>          .settings
04/12/2012  12:09 AM    <DIR>          bin
04/12/2012  12:09 AM    <DIR>          src
04/11/2012  11:07 PM    <DIR>          test
               2 File(s)            684 bytes
               6 Dir(s)  429,106,937,856 bytes free

しかし、これを実行するとハングアップしますline=input.readLine()

public static void main(String args[])
{
    try {
        Process p = Runtime.getRuntime().exec("cmd /c del test");
        read(p);
        OutputStream oStream = p.getOutpuStream();
        BufferedWriter sWriter = new BufferedWriter(newOutputStreamWriter(oStream));
        sWriter.write("y");
        sWriter.newLine();
        oStream.close();
        read(p);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

このぶら下がりを防ぐにはどうすればよいですか?また、確認の「y」が正しく送信されていないことも懸念されます。出力を読んで入力を書くべきだと思いますが、これはオンラインの複数のサイトで見つけた方法です。どんな助けでも大歓迎です。

4

2 に答える 2

3

プロセス Java を起動するときは、エラー ストリームと入力ストリームの両方がいっぱいになる前に読み取る必要があります。Linux/OS X ではそれほど大きな問題ではありませんが、Windows では JVM と子プロセスの間のバッファが非常に小さいため、すぐに読み取りを開始しないとプログラムがハングします。コードは入力ストリームに対してそれを行っているようですが、エラー ストリームに対しては行っていないようです。そのため、del からの確認がエラー ストリームで行われている場合は、プロセスをハングさせるのに十分です。

Java には、出力ストリームとエラー ストリームを結合する方法があります。最も簡単な方法は、プロセスを作成するときにProcessBuilder.redirectErrorStream()を使用することです。

コードで考えられるもう 1 つの問題はreadLine().、子プログラムが改行なしで出力を送信した場合、親プログラムがそれを受信しないことです。 . BufferedReader を使用するのは良いことですが、一度に 1 バイト/文字を読み取る必要があります。また、コードが専用スレッドでそれを行うと、より堅牢になり、入力を渡そうとしているときにプログラムが出力を送信してもハングしません。

また、del には、確認を求めないようにするオプションがあります。del /? を試してみてください。コマンドプロンプトから。

幸運を!

于 2012-04-12T04:55:59.757 に答える
0

すべての標準 io (stdin、stdout、stderr) 操作は、3 つのストリーム (Process.getOutputStream()、Process.getInputStream()、Process.getErrorStream()) を介して元のプロセスから親プロセスにリダイレクトされます。メッセージの確認が ErrorStream の一部であるかどうかを確認してください。また、削除の確認 y を入力するには、inputStream を使用する必要があります。

于 2012-04-12T04:54:19.080 に答える