首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >进程生成器导致error2无法找到指定的路径,即使命令从cmd运行。

进程生成器导致error2无法找到指定的路径,即使命令从cmd运行。
EN

Stack Overflow用户
提问于 2016-05-02 11:21:35
回答 1查看 1.8K关注 0票数 3

我使用ProcessBuilder从java代码执行mysqldump,这是我的代码

代码语言:javascript
复制
    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的完整路径,并得到了相同的结果。

代码语言:javascript
复制
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
EN

Stack Overflow用户

回答已采纳

发布于 2016-05-02 11:38:31

首先,使用数组调用ProcessBuilder(String... command),这意味着数组的第一个值是程序。但是,您正在发送整个字符串"mysqldump -u root -P 3316 -h localhost > G:\\test.sql",而这不是一个程序。只有mysqldump才是程序。

第二,在使用getInputStream()捕获输出时,您需要在调用waitFor()之前这样做,否则,您的输出缓冲区可能会完全运行,从而停止正在运行的程序的执行,从而在等待命令退出的程序和等待您读取输出的命令之间造成死锁。如果需要该流,通常需要在一个单独的线程中读取它。

第三,不能在命令字符串中使用>重定向输出。这是cmd.exe所做的事情,而不是调用cmd.exe。由于您希望重定向到文件,所以直接使用ProcessBuilder进行重定向。

代码语言:javascript
复制
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);
}
票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36981215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档