【问题标题】:Process hangs waitFor() method进程挂起 waitFor() 方法
【发布时间】:2016-02-21 09:27:20
【问题描述】:

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

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

我尝试在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/

我做错了什么?

【问题讨论】:

  • 您是否尝试阅读该方法的documentation 以了解其工作原理?
  • adb 不列出文件或目录。你为什么要开始它?
  • 不要提供可以是文本的图像信息。

标签: java android process processbuilder


【解决方案1】:

javadoc 表示ProcessBuilder 构造函数的参数是:

“...一个包含程序及其参数的字符串数组”。

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

我建议您查看 the example in the javadoc 以了解您应该如何实例化 ProcessBuilder 对象。

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

【讨论】:

  • 谢谢,解决方法是:阅读完所有输出后调用waitFor()
【解决方案2】:

试试这个方法.. 必须消耗命令执行期间的任何错误才能退出 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();
    }

}

【讨论】:

    猜你喜欢
    • 2012-07-30
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    相关资源
    最近更新 更多