2

関数でコマンドを使用しながら、端末からの応答を読み取ろうとしていProcess()ます。私は他の例を見てきましたが、それを機能させることができません。たとえば、データを処理してプログレスバーを使用したくないので、ターミナルに表示されたときにデータにアクセスする必要があります。私のコードでは、 textArea を使用して、今のところ機能するかどうかを確認しています。Eclipse でコンソールにデータを表示できますが、textArea には何も表示されません。私は何を間違っていますか?

public void unPack(String filePath, String directory)
{
    ProcessBuilder pb = new ProcessBuilder("/usr/local/bin/unrar", "x", "-y",filePath);
    pb.inheritIO();
    pb.directory(new File(directory));
    try 
    {

        final Process p = pb.start();

        BufferedReader in = new BufferedReader(  
                new InputStreamReader(p.getInputStream()));  
        String line = null;  
        while ((line = in.readLine()) != null) {  
            textArea.setText(line);  
        }  

        try 
        {
            int exitVal = p.waitFor();

        } 
        catch (InterruptedException e) 
        {
            e.printStackTrace();
        }

    } 
    catch (IOException e) 
    {
        e.printStackTrace();
    }

}

自分でコマンドを実行したときの Mac ターミナルの応答は次のとおりです。

    UNRAR 4.20 freeware      Copyright (c) 1993-2012 Alexander Roshal


Extracting from testrar.part1.rar

Extracting  testfile.mkv                                              23%

Extracting from testrar.part2.rar

...         testfile.mkv                                              46%

Extracting from testrar.part3.rar

...         testfile.mkv                                              70%

Extracting from testrar.part4.rar

...         testfile.mkv                                              93%

Extracting from testrar.part5.rar

...         testfile.mkv                                              OK 
All OK
4

3 に答える 3

0

次のいずれかを行っています。

  1. unPackメソッドはイベント ディスパッチャー スレッド( EDT)で実行されます。
  2. メソッドunPackは別のスレッドで実行されます

最初のケースである場合、EDT をブロックしているため、UI の再描画が停止します。この場合、別のスレッドでこのメソッドを呼び出し、次の説明を読んでください。

2 番目のケースの場合は、EDT 以外の別のスレッドで Swing UI を更新しようとしています。これは慎重に扱う必要があります。これを行うには、さまざまな方法があります。最も単純なものの 1 つはSwingUtilities.invokeLater()メソッドです。

これが役立つことを願っています。

于 2013-05-19T11:16:23.047 に答える
0

setText を実行するたびに上書きすると思います。これがコンソールで機能していることがわかるとしたら、 setText を使用すると、これが高速に発生した場合に最後に設定されたものだけが表示されるように見えるため、空の行だけが最後に設定されている可能性があります。また、その時点でデータの準備ができていない場合、行を継続的に読み取ることはありません。このようなことをしたとき、最初にランタイムを使用しましたが、問題がプロセスを取得する原因とはわかりませんが、終了を送信するか文字列を取得するまでループできるスレッドにありますこれは、いくつかの readline にデータがないと仮定して、すべてのデータを取得するまでループする必要があるため、終了または最後の行を意味します。

于 2013-05-19T11:02:05.863 に答える