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

时间:2013-05-19 10:57:05

标签: 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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

  1. 您的unPack方法在事件调度程序线程(EDT)中运行
  2. 您的unPack方法在单独的线程中运行
  3. 如果是第一种情况,那么您将阻止EDT,这会停止重新绘制UI。如果是这种情况,您应该在单独的线程上调用此方法,并阅读以下说明。

    如果是第二种情况,那么您尝试在除EDT之外的其他线程上更新Swing UI。你应该精心处理这个问题。这样做有不同的方法。其中最简单的是SwingUtilities.invokeLater()方法。

    我希望这会有所帮助。

答案 2 :(得分:0)

好问题。 Rar的问题在于,当处理百分比更新时,它不会打印一行。所以你必须改为读取字符。

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代码

问题是现在,如何阅读百分比。我还没想出来。