Java ProcessBuilder可以';找不到文件?!
另一个问题接踵而至,但这肯定是一个我没有看到的非常明显的错误。我已经编写了一些代码来运行下面的批处理文件,但我收到一条错误消息,说它找不到该文件,但我可以向您保证,该文件确实存在于目录中Java ProcessBuilder可以';找不到文件?!,java,batch-file,processbuilder,Java,Batch File,Processbuilder,另一个问题接踵而至,但这肯定是一个我没有看到的非常明显的错误。我已经编写了一些代码来运行下面的批处理文件,但我收到一条错误消息,说它找不到该文件,但我可以向您保证,该文件确实存在于目录中 public class Pull { public void pullData() throws IOException { ProcessBuilder pb = new ProcessBuilder("adb.bat"); File f = new File("C:\\"); p
public class Pull {
public void pullData() throws IOException {
ProcessBuilder pb = new ProcessBuilder("adb.bat");
File f = new File("C:\\");
pb.directory(f);
Process p = pb.start();
}
public static void main(String[] args) throws IOException {
Pull pull = new Pull();
pull.pullData();
}
}
下面是错误消息
Exception in thread "main" java.io.IOException: Cannot run program "adb.bat" (in directory "C:\"): CreateProcess error=2, The system cannot find the file specified
我正在运行Linux,但在运行您的代码(修改为运行.sh而不是.bat)时也会发生相同的错误 尝试: 显然,使用
ProcessBuilder.directory
不会影响构建生成器时选择的工作目录(用于发现可执行文件)(至少,这似乎是发生的事情。文档说它会更改工作目录,所以我猜输入/输出文件可能与此相关?)
我不确定它实际上在内部做什么,但在构造函数中提供可执行文件的路径修复了这个问题
这篇文章,但也提出了是否必须设置环境变量,其中类似于“路径”的变量可能有助于
ProcessBuilder
发现可执行文件。请尝试在此处使用教程-。使用它,我对你的类做了一些修改,它找到了文件(注意,我不知道里面是什么,所以不能完全测试它)。它的编译和运行没有问题,而您自己的I遇到了与您相同的问题:
public class Pull {
public void pullData() throws IOException {
/*ProcessBuilder pb = new ProcessBuilder("adb.bat");
File f = new File("C:\\");
pb.directory(f);
Process p = pb.start();
*/
ProcessBuilder p = new ProcessBuilder("C:\\adb.bat");
p.start();
System.out.println(p.toString());
}
public static void main(String[] args) throws IOException {
Pull pull = new Pull();
pull.pullData();
}
}
那么,adb.bat是c:\,对吗?试着把它或它的副本放在项目文件夹中也不行。我是否正确使用processbuilder?您是否尝试过将批处理文件的内容作为
processbuilder
的参数执行?例如,如果“adb.bat”执行类似于“java-version”的操作,您是否尝试过执行类似于新ProcessBuilder(“java”、“-server”)
?我想知道Java是否试图将adb.bat视为可执行文件,即使它实际上只是一个基于文本的脚本。您是否尝试过在构造函数中包含路径(例如,newProcessBuilder(“c:\\adb.bat”)
?请参阅在Linux上,如果命令位于目录中,并使用ProcessBuilder
更改到该目录,则仅执行命令将失败,但执行/command
会起作用。因此,process builder正在更改到目录中,但需要具体执行ode>/command
在该目录中,除非该目录位于$PATH
上。
public class Pull {
public void pullData() throws IOException {
/*ProcessBuilder pb = new ProcessBuilder("adb.bat");
File f = new File("C:\\");
pb.directory(f);
Process p = pb.start();
*/
ProcessBuilder p = new ProcessBuilder("C:\\adb.bat");
p.start();
System.out.println(p.toString());
}
public static void main(String[] args) throws IOException {
Pull pull = new Pull();
pull.pullData();
}
}