首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可能原因java.io.IOException: CreateProcess error=2,系统找不到指定的文件

可能原因java.io.IOException: CreateProcess error=2,系统找不到指定的文件
EN

Stack Overflow用户
提问于 2012-03-19 21:58:19
回答 2查看 5.3K关注 0票数 0

我正在尝试通过java执行'VACUUM VERBOSE‘命令。以下是我的代码

代码语言:javascript
复制
public void executeCommand()
{
    String cmd1= "cmd.exe /c start";
    String location="C:\\PROGRA~1\\PostgreSQL\\8.3\\bin\\";
    String postgresCommand="psql -h localhost -U postgres -d postgres";
    String autoVaccum="-c \"vacuum verbose\"";
    String []actualCmd={cmd1,location,postgresCommand,autoVaccum};

    Process process=null;
    try {
        process = Runtime.getRuntime().exec(actualCmd);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}


public static void main(String[] args) {
    MyTest test= new MyTest();
    test.executeCommand();

}

但是我得到了下面的异常

代码语言:javascript
复制
java.io.IOException: Cannot run program "cmd.exe /c start": CreateProcess error=2, The system cannot find the file specified
    at java.lang.ProcessBuilder.start(Unknown Source)
    at java.lang.Runtime.exec(Unknown Source)
    at java.lang.Runtime.exec(Unknown Source)
    at MyTest.executeCommand(MyTest.java:36)
    at MyTest.main(MyTest.java:48)
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>(Unknown Source)
    at java.lang.ProcessImpl.start(Unknown Source)
    ... 5 more

当我直接在开始->运行窗口中直接输入上面的字符串时,它成功地执行了,例如。cmd.exe /C start C:\PROGRA~1/PostgreSQL/8.3/bin/psql -h本地主机-U postgres -d postgres -c "vacuum verbose“

有没有人知道上面的程序到底出了什么问题?

EN

回答 2

Stack Overflow用户

发布于 2012-03-19 22:17:33

调用exec()有多种方法。您正在使用的on将String[]作为参数,它期望每个标记都位于数组的不同部分。因此,对

代码语言:javascript
复制
Runtime.getRuntime().exec("cmd /c start executable arg1 arg2");

当使用数组而不是一个字符串调用时,将被调用为

代码语言:javascript
复制
Process p = Runtime.getRuntime().exec(new String[]{"cmd","/c","start","executable","arg1","arg2");    
BufferedReader inReader = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedWriter outWriter = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));

exec()返回一个Process对象,然后可以使用getInputStream()获取该对象的输出。这实际上是进程的输出,它是java代码的输入。然后,您可以像读取任何其他流一样读取它,并在您认为合适的时候将其显示给用户。

票数 1
EN

Stack Overflow用户

发布于 2012-03-19 22:09:49

您将cmd.exe /c start作为单个参数传递,因此它查找名为cmd.exe /c start的文件,但失败了。

而是将cmd1拆分为两个字符串:cmd.exe/c start

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9771548

复制
相关文章

相似问题

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