繁体   English   中英

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

[英]Java: Read data from the terminal using Process()

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

我每次相信setText时都会重写。 如果您说可以在控制台中看到它正在运行,则使用setText似乎可以看到,如果这一切发生得很快,它就是它设置的最后一件事,因此它可以正常工作,只是最后一行设置了一个空行。 如果在那个确切的时刻没有数据准备好,它将不会连续读取行。 当我做这样的事情时,首先我使用了运行时,但我认为没有问题,原因是我得到了一个进程,但是我将其放在一个线程中,直到可以发送退出或得到一个字符串为止,它可以循环这意味着退出或最后一行,因为它只需要循环直到所有数据都假定某个读取行没有数据即可。

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

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

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

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

我希望这有帮助。

好问题。 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码

现在的问题是,如何读取百分比。 我还没有想到。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM