我尝试在 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
方法在Event Dispatcher Thread (EDT) 中运行 - 您的
unPack
方法在单独的线程中运行
如果是第一种情况,您将阻止 EDT,这会阻止您的 UI 重绘。如果是这种情况,您应该在单独的线程上调用此方法,并阅读以下说明。
如果是第二种情况,那么您正在尝试在除 EDT 之外的其他线程上更新 Swing UI。你应该谨慎处理这件事。有不同的方法可以做到这一点。最简单的一种是 SwingUtilities.invokeLater()方法。
希望对您有所帮助。
关于Java:使用 Process() 从终端读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16633883/