Java执行外部程序并读取其输出

时间:2018-12-01 17:00:35

标签: java

我想读取ADB logcat(https://developer.android.com/studio/command-line/adb)的输出。我有这样的代码(测试):

    try {
        Process p = Runtime.getRuntime().exec("sh -c adb logcat");
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(p.getInputStream()));
        while(true) {
            String s = bufferedReader.readLine();
            if(s == null) {
                continue;
            }
            System.out.println("From process: " + s);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

但这不会打印任何内容。如果执行此操作:

Process p = Runtime.getRuntime().exec("sh -c ls");

有效。

1 个答案:

答案 0 :(得分:0)

好的,我太快问了SO的问题。

我读取错误流而不是输入流,并且发现找不到程序ADB。需要提供完整路径:

ProcessBuilder processBuilder = new ProcessBuilder("/home/UserName/Soft/Android/Sdk/platform-tools/adb", "logcat");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(p.getInputStream()));

但是在另一台计算机上的路径是不同的。此外,您还可以在每台计算机上进行符号链接,并在代码中仅使用“ adb”作为路径:

sudo ln -s /home/UserName/Soft/Android/Sdk/platform-tools/adb /bin/adb

ProcessBuilder processBuilder = new ProcessBuilder("adb", "logcat");

这不是最佳解决方案,可以部分解决问题。如果在实例化ProcessBuilder对象时仅使用“ adb”,而无需进行符号链接,那就太好了。因为在计算机的每个磁盘位置上,我都可以在终端中使用ADB,所以它是可见的,但是在此代码中没有。在Windows中,我知道这是在“系统环境”>“路径”中。在Linux中,我编写了命令“ printenv”,但在android&adb中看不到任何东西。