我正在尝试在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

最佳答案

您正在执行以下操作之一:


您的unPack方法在事件分派器线程(EDT)中运行
您的unPack方法在单独的线程中运行


如果是第一种情况,则您将阻止EDT,这将阻止重新粉刷您的UI。如果是这种情况,则应在单独的线程上调用此方法,并阅读以下说明。

如果是第二种情况,则您尝试在EDT以外的其他线程上更新Swing UI。您应该细心处理。有不同的方法可以执行此操作。最简单的方法之一是SwingUtilities.invokeLater()方法。

我希望这有帮助。

10-06 07:12
查看更多