[英]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似乎可以看到,如果这一切发生得很快,它就是它设置的最后一件事,因此它可以正常工作,只是最后一行设置了一个空行。 如果在那个确切的时刻没有数据准备好,它将不会连续读取行。 当我做这样的事情时,首先我使用了运行时,但我认为没有问题,原因是我得到了一个进程,但是我将其放在一个线程中,直到可以发送退出或得到一个字符串为止,它可以循环这意味着退出或最后一行,因为它只需要循环直到所有数据都假定某个读取行没有数据即可。
您正在执行以下操作之一:
unPack
方法在事件分派器线程 (EDT)中运行 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.