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 被重新绘制。如果是这种情况,您应该在单独的线程上调用此方法,并阅读以下说明。

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

我希望这有帮助。

于 2013-05-19T11:16:23.047 回答
0

好问题。Rar 的问题是当进程百分比更新时它不打印一行。所以你必须改为阅读 char(s) 。

void setup() {
  unPack("c:/temp/Downloads.rar", "c:/temp/Downloads");
}

void unPack(String Rarfile, String directory) {
  ProcessBuilder pb = new ProcessBuilder("C:/Program Files/WinRAR/UnRAR.exe", 
  "e", Rarfile, directory);
  //pb.inheritIO(); //unknown method
  //pb.directory(new File(directory)); // ?
  try {
    final Process p = pb.start();
    BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));  
    int line = 0;  
    while ( (line = in.read()) > 0 ) {  
      print((char)line); //remove (char) to see ascii codes
    } 
    try {
      int exitVal = p.waitFor();
    } 
    catch (InterruptedException e) {
      e.printStackTrace();
    }
  } 
  catch (IOException e) {
    e.printStackTrace();
  }
}

请务必阅读以下行: print((char)line); //删除(char)以查看ascii代码

现在的问题是,如何读取百分比。我还没有弄清楚。

于 2013-05-19T15:12:23.690 回答
0

每次你做 setText 你都会写我相信。如果你说你可以看到它在控制台中工作,那么在 setText 看来,你看到的只是它设置的最后一件事,如果这发生得很快,所以它可能只是一个空行是最后设置的。如果在那一刻没有准备好数据,它也不会连续读取行。当我做了这样的事情时,首先我使用了一个运行时,但我认为这并不重要,因为我得到了一个进程,但我把它放在一个线程中,它可以循环直到我发送退出或它得到一个字符串这意味着退出或最后一行,因为它只需要循环直到它得到所有数据,假设某些 readline 没有数据。

于 2013-05-19T11:02:05.863 回答