getRuntime()。exec()什么都不做

时间:2014-10-10 16:10:50

标签: java

我想要一个java程序来执行以下shell命令:

apktool.jar d /path/to/my/app.apk

在命令行上直接执行此命令时,此命令非常有效。

Java代码:

public static void main(String[] args) {

    String command = "apktool d /path/to/my/app.apk";
    try {
        Runtime.getRuntime().exec(command);
    } catch (IOException e1) {
        e1.printStackTrace();
    }
}

没有错误,没有例外。什么都没发生,我的印象是我已经在整个互联网上搜索了一个解决方案。有谁知道我做错了什么?像

这样的简单命令

mkdir / path / to / a / new / folder

没有问题。

我使用ProcessBuilder尝试了相同的操作:

try {
    Process process = new ProcessBuilder(command).start();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

这次我只得到“无法运行程序”apktool d /path/to/my/app.apk,没有这样的文件或目录“。我甚至无法运行 mkdir 命令。

2 个答案:

答案 0 :(得分:2)

您需要使用java.exe调用jar,并且您没有这样做。此外,您还需要捕获流程中的输入和错误流,这是您无法按照自己的方式运行的。请改用ProcessBuilder,获取流,然后运行该流程。

例如(我只能做一个Windows示例),

import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;

public class ProcessEg {
   private static Process p;

   public static void main(String[] args) {
      String[] commands = {"cmd", "/c", "dir"};
      ProcessBuilder pBuilder = new ProcessBuilder(commands);
      pBuilder.redirectErrorStream();

      try {
         p = pBuilder.start();
         InputStream in = p.getInputStream();
         final Scanner scanner = new Scanner(in);
         new Thread(new Runnable() {
            public void run() {
               while (scanner.hasNextLine()) {
                  System.out.println(scanner.nextLine());
               }
               scanner.close();
            }
         }).start();
      } catch (IOException e) {
         e.printStackTrace();
      }
      try {
         int result = p.waitFor();
         p.destroy();
         System.out.println("exit result: " + result);
      } catch (InterruptedException e) {
         e.printStackTrace();
      }
   }
}

答案 1 :(得分:0)

尝试这样做:

    StringBuffer output = new StringBuffer();
    Process p;
    try {
        p = Runtime.getRuntime().exec("./path/apktool d /path/to/my/app.apk");
        p.waitFor();
        BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line = "";           
        while ((line = reader.readLine())!= null) {
            output.append(line + "\n");
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

    system.out.println(output.toString());

首先创建一个进程,允许您等待响应并读取进程执行的输出。

如果在运行shell命令时出现故障,则最后会打印错误。

另外,请确保您的java程序可以访问您的shell脚本,或者更好地提供它的完整路径,如:

./path/to/shell/apktool d /path/to/my/app.apk