使用 ProcessBuilder 执行本地可执行文件
Exec local executable with ProcessBuilder
网上找不到解决办法,所以想在这里问一下
我有一个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?
假设应用程序资源是实际文件是不可靠的。相反,使用 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);
}
}
网上找不到解决办法,所以想在这里问一下
我有一个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?
假设应用程序资源是实际文件是不可靠的。相反,使用 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);
}
}