进程挂起 waitFor() 方法
Process hangs waitFor() method
我正在尝试从 java 的根 android 设备中的 /data/data 文件夹中获取所有文件和文件夹。我有在 windows cmd:
中正常工作的命令
adb -s <device name> shell su -c ls /data/data/
我尝试在 java 中执行此命令,一切似乎都正常,但行
p.waitFor();
从不returns.
public ArrayList<String> execute(String command) {
ArrayList<String> line = new ArrayList<String>();
try {
ProcessBuilder pb = new ProcessBuilder(adbPath + "adb.exe ", command);
pb.redirectErrorStream(true);
Process p = pb.start();
p.waitFor();
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String tmp;
while ((tmp = in.readLine()) != null) {
line.add(tmp);
}
line.removeAll(Arrays.asList("", null));
}
catch (Exception ex) {
ex.printStackTrace();
}
return line;
}
//adbPath = C:\Users\redra_000\AppData\Local\Android\sdk\platform-tools\
//command = -s E7AZCY935671 shell su -c ls /data/data/
我做错了什么?
javadoc 表示 ProcessBuilder
构造函数的参数是:
"... a string array containing the program and its arguments".
和 example 清楚地表明它意味着每个参数都有单独的字符串。您已将所有参数作为一个字符串传递。此外,您在命令路径名的末尾添加了一个虚假的 space。
我建议您查看 the example in the javadoc 以了解应该如何实例化 ProcessBuilder
对象。
另一个问题是您似乎在从 adb
读取输出之前调用了 waitFor()
。如果你这样做并且 adb
产生的输出多于管道中可以缓冲的输出,那么你将陷入僵局。调用 waitFor()
在 阅读完所有输出后。
试试这个方法..
为了退出 Process.Waitfor() 方法
,必须消耗命令执行期间的任何错误
public void executeScript(String command) {
try {
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(command);
InputStream stdin = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(stdin);
BufferedReader br = new BufferedReader(isr);
String line = null;
while ((line = br.readLine()) != null)
System.out.println(line);
proc.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
}
我正在尝试从 java 的根 android 设备中的 /data/data 文件夹中获取所有文件和文件夹。我有在 windows cmd:
中正常工作的命令adb -s <device name> shell su -c ls /data/data/
我尝试在 java 中执行此命令,一切似乎都正常,但行
p.waitFor();
从不returns.
public ArrayList<String> execute(String command) {
ArrayList<String> line = new ArrayList<String>();
try {
ProcessBuilder pb = new ProcessBuilder(adbPath + "adb.exe ", command);
pb.redirectErrorStream(true);
Process p = pb.start();
p.waitFor();
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String tmp;
while ((tmp = in.readLine()) != null) {
line.add(tmp);
}
line.removeAll(Arrays.asList("", null));
}
catch (Exception ex) {
ex.printStackTrace();
}
return line;
}
//adbPath = C:\Users\redra_000\AppData\Local\Android\sdk\platform-tools\
//command = -s E7AZCY935671 shell su -c ls /data/data/
我做错了什么?
javadoc 表示 ProcessBuilder
构造函数的参数是:
"... a string array containing the program and its arguments".
和 example 清楚地表明它意味着每个参数都有单独的字符串。您已将所有参数作为一个字符串传递。此外,您在命令路径名的末尾添加了一个虚假的 space。
我建议您查看 the example in the javadoc 以了解应该如何实例化 ProcessBuilder
对象。
另一个问题是您似乎在从 adb
读取输出之前调用了 waitFor()
。如果你这样做并且 adb
产生的输出多于管道中可以缓冲的输出,那么你将陷入僵局。调用 waitFor()
在 阅读完所有输出后。
试试这个方法.. 为了退出 Process.Waitfor() 方法
,必须消耗命令执行期间的任何错误public void executeScript(String command) {
try {
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(command);
InputStream stdin = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(stdin);
BufferedReader br = new BufferedReader(isr);
String line = null;
while ((line = br.readLine()) != null)
System.out.println(line);
proc.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
}