gpt4 book ai didi

java - 进程挂起 waitFor() 方法

转载 作者:行者123 更新时间:2023-11-29 20:06:55 28 4
gpt4 key购买 nike

我正在尝试从 java 的 root android 设备中的/data/data 文件夹中获取所有文件和文件夹。我有在 Windows cmd 中正常工作的命令:

adb -s <device name> shell su -c ls /data/data/

example

我尝试在 java 中执行此命令,一切似乎都正常,但行

p.waitFor(); 

永不返回。

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清楚地表明它意味着每个参数都有单独的字符串。您已将所有参数作为一个字符串传递。此外,您在命令路径名的末尾添加了一个虚假空格。

我建议你看看the example in the javadoc看看你应该如何实例化一个 ProcessBuilder 对象。

另一个问题是您似乎在从 adb 读取输出之前调用了 waitFor()。如果您这样做并且 adb 产生的输出多于管道中可以缓冲的输出,那么您将遇到死锁。读取所有输出后调用 waitFor()

关于java - 进程挂起 waitFor() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35534417/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com