进程挂起 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();
    }

}