Java:使用 Process() 从终端读取数据

标签 java process terminal

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

最佳答案

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

  1. 您的unPack 方法在Event Dispatcher Thread (EDT) 中运行
  2. 您的unPack 方法在单独的线程中运行

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

如果是第二种情况,那么您正在尝试在除 EDT 之外的其他线程上更新 Swing UI。你应该谨慎处理这件事。有不同的方法可以做到这一点。最简单的一种是 SwingUtilities.invokeLater()方法。

希望对您有所帮助。

关于Java:使用 Process() 从终端读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16633883/

相关文章:

java - 有没有办法从 Java 中的列表列表中删除子列表?

bash - 如何在 bash 终端中选择行

java - @Resource 没有设置 javax.ejb.TimerService

java - 同时对两个数组列表进行排序

python - 在两个线程进程之间访问数据

android - 杀死Android中的其他进程

terminal - 删除 gnome 终端配置

macos - 如何在 Mac 终端中使用 SoX 从文本文件中修剪特定时间的音频文件?

java - 设置ArrayLists的ArrayList的初始容量

.net - 列出进程中的 AppDomain