进程生成器导致 error2 即使命令从 cmd 运行也找不到指定的路径
process builder causes error2 cannot find path specified even though the command runs from cmd
我正在使用 ProcessBuilder
从 java 代码执行 mysqldump
这是我的代码
public static void executeCommant(String... command) throws Exception {
ProcessBuilder processBuilder = null;
processBuilder = new ProcessBuilder(command);
processBuilder.redirectErrorStream(true);
Process process = processBuilder.start();
int resultCode = process.waitFor();
if (resultCode != 0) {
throw new Exception("" + readCommandOutput(process.getInputStream()));
}
}
private static String readCommandOutput(InputStream inputStream) throws IOException {
StringBuilder sb = new StringBuilder();
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(inputStream));
String line = null;
while ((line = br.readLine()) != null) {
sb.append(line + System.getProperty("line.separator"));
}
} finally {
br.close();
}
return sb.toString();
}
public static void main(String[] args) throws Exception {
executeCommant("mysqldump -u root -P 3316 -h localhost > G:\test.sql");
}
问题是我收到以下异常,即使当我从 cmd 运行 使用相同的命令时我没有遇到任何问题,而且我只是不明白为什么它找不到指定的文件!!
PS:我尝试给出 mysqldump.exe 的完整路径并得到相同的结果
Exception in thread "main" java.io.IOException: Cannot run program "mysqldump -u root -P 3316 -h localhost > G:\test.sql": CreateProcess error=2, The system cannot find the file specified
at java.lang.ProcessBuilder.start(ProcessBuilder.java:470)
at com.etq.e2mc.platform.windows.WindowsProcess.executeCommant(WindowsProcess.java:46)
at com.etq.e2mc.platform.windows.WindowsProcess.main(WindowsProcess.java:67)
Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified
at java.lang.ProcessImpl.create(Native Method)
at java.lang.ProcessImpl.<init>(ProcessImpl.java:177)
at java.lang.ProcessImpl.start(ProcessImpl.java:28)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:452)
... 2 more
首先,您使用数组调用 ProcessBuilder(String... command)
,这意味着数组的第一个值就是程序。但是,您发送的是整个字符串 "mysqldump -u root -P 3316 -h localhost > G:\test.sql"
,这不是程序。只有mysqldump
是程序。
其次,当使用 getInputStream()
捕获输出时,您需要在 调用 waitFor()
之前执行该操作 ,否则您的输出缓冲区有风险 运行 完全停止执行您正在 运行 的程序,本质上导致等待命令退出的程序与等待您读取输出的命令之间的死锁。如果需要流,一般需要在单独的线程中读取。
第三,您不能在命令字符串中使用 >
重定向输出。那是 cmd.exe
所做的事情,而您并没有调用 cmd.exe
。因为你想重定向到一个文件,直接使用 ProcessBuilder
.
ProcessBuilder processBuilder = new ProcessBuilder(
"mysqldump", "-u", "root", "-P", "3316", "-h", "localhost");
processBuilder.redirectErrorStream(true);
processBuilder.redirectOutput(new File("G:\test.sql"));
Process process = processBuilder.start();
int resultCode = process.waitFor();
if (resultCode != 0) {
throw new Exception("Program failed with error " + resultCode);
}
我正在使用 ProcessBuilder
从 java 代码执行 mysqldump
这是我的代码
public static void executeCommant(String... command) throws Exception {
ProcessBuilder processBuilder = null;
processBuilder = new ProcessBuilder(command);
processBuilder.redirectErrorStream(true);
Process process = processBuilder.start();
int resultCode = process.waitFor();
if (resultCode != 0) {
throw new Exception("" + readCommandOutput(process.getInputStream()));
}
}
private static String readCommandOutput(InputStream inputStream) throws IOException {
StringBuilder sb = new StringBuilder();
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(inputStream));
String line = null;
while ((line = br.readLine()) != null) {
sb.append(line + System.getProperty("line.separator"));
}
} finally {
br.close();
}
return sb.toString();
}
public static void main(String[] args) throws Exception {
executeCommant("mysqldump -u root -P 3316 -h localhost > G:\test.sql");
}
问题是我收到以下异常,即使当我从 cmd 运行 使用相同的命令时我没有遇到任何问题,而且我只是不明白为什么它找不到指定的文件!! PS:我尝试给出 mysqldump.exe 的完整路径并得到相同的结果
Exception in thread "main" java.io.IOException: Cannot run program "mysqldump -u root -P 3316 -h localhost > G:\test.sql": CreateProcess error=2, The system cannot find the file specified
at java.lang.ProcessBuilder.start(ProcessBuilder.java:470)
at com.etq.e2mc.platform.windows.WindowsProcess.executeCommant(WindowsProcess.java:46)
at com.etq.e2mc.platform.windows.WindowsProcess.main(WindowsProcess.java:67)
Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified
at java.lang.ProcessImpl.create(Native Method)
at java.lang.ProcessImpl.<init>(ProcessImpl.java:177)
at java.lang.ProcessImpl.start(ProcessImpl.java:28)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:452)
... 2 more
首先,您使用数组调用 ProcessBuilder(String... command)
,这意味着数组的第一个值就是程序。但是,您发送的是整个字符串 "mysqldump -u root -P 3316 -h localhost > G:\test.sql"
,这不是程序。只有mysqldump
是程序。
其次,当使用 getInputStream()
捕获输出时,您需要在 调用 waitFor()
之前执行该操作 ,否则您的输出缓冲区有风险 运行 完全停止执行您正在 运行 的程序,本质上导致等待命令退出的程序与等待您读取输出的命令之间的死锁。如果需要流,一般需要在单独的线程中读取。
第三,您不能在命令字符串中使用 >
重定向输出。那是 cmd.exe
所做的事情,而您并没有调用 cmd.exe
。因为你想重定向到一个文件,直接使用 ProcessBuilder
.
ProcessBuilder processBuilder = new ProcessBuilder(
"mysqldump", "-u", "root", "-P", "3316", "-h", "localhost");
processBuilder.redirectErrorStream(true);
processBuilder.redirectOutput(new File("G:\test.sql"));
Process process = processBuilder.start();
int resultCode = process.waitFor();
if (resultCode != 0) {
throw new Exception("Program failed with error " + resultCode);
}