使用ProcessBuilder执行本地可执行文件

时间:2017-05-09 13:05:54

标签: java exec

无法通过网络找到解决方案,所以决定在这里问一下

我有such structure of a project

我想要的是:我希望ProcessBuilder使用我的本地adb.exe

例如我的ProcessBuilder的String []:

case "devicesListString":
    String[] devicesListString = {"./adb.exe","devices"};
    return devicesListString;

这是ProcessBuilder启动的方式

public Process initNewProcessBuilderOnProcess(Tab tab, String[] str) throws IOException {
    ProcessBuilder vr = new ProcessBuilder(str);
    vr.directory(new File(System.getProperty("user.dir")));
    vr.redirectErrorStream(true);
    Process pr = vr.start();
    tabAndProcessMap.put(tab, pr);
    return pr;
}

vr.directory已添加,但没有结果。 如何访问adb.exe的资源? 也许我需要其他东西,而不是ProcessBuilder?

1 个答案:

答案 0 :(得分:1)

假设应用程序资源是实际文件是不可靠的。相反,使用Java的getResource *方法之一来读取资源,并将其复制到实际文件中:

Path adb = Files.createTempFile("adb", ".exe");

try (InputStream stream = Testinghelper.class.getResourceAsStream("adb.exe")) {
    Files.copy(stream, adb, StandardCopyOption.REPLACE_EXISTING);
}

ProcessBuilder builder = new ProcessBuilder(adb.toString(), "devices");

在Windows以外的操作系统上,在将新文件传递给ProcessBuilder之前,可能需要使新文件可执行:

PosixFileAttributeView view =
    Files.getFileAttributeView(adb, PosixFileAttributeView.class);
if (view != null) {
    Set<PosixFilePermission> perms = view.readAttributes().permissions();
    if (perms.add(PosixFilePermission.OWNER_EXECUTE)) {
        view.setPermissions(adb, perms);
    }
}
相关问题