java.lang.ProcessBuilder抛出未经怀疑的IOException

时间:2012-03-25 10:34:17

标签: java processbuilder

也许我有点幼稚,但我想这不应该那样。
首先我的代码:

   private String ExeName="dc64cmd.exe";
   private String Dir=System.getenv("ProgramFiles(x86)") +"\\12noon Display Changer\\";           
   private String DetachArgument = "-monitor=\"PnP-Monitor (Standard)\" -detach";
   try {
        System.out.println(new File(Dir+ExeName).exists()); 
        //This prints "true" as expected.


        ProcessBuilder pb = new ProcessBuilder(ExeName, DetachArgument);
        pb=pb.directory(new File(Dir));

        pb=pb.redirectError(ProcessBuilder.Redirect.INHERIT);
        pb=pb.redirectOutput(ProcessBuilder.Redirect.INHERIT);
        pb=pb.redirectInput(ProcessBuilder.Redirect.INHERIT);
        //afaik the 3 lines above are not necessary. But just to be sure..

        pb.start();
    } catch (java.io.IOException IOexc) {
        System.err.println(IOexc.toString());
    }

程序的输出是

true
java.io.IOException: Cannot run program "dc64cmd.exe" (in directory "C:\Program Files (x86)\12noon Display Changer"): CreateProcess error=2, Das System kann die angegebene Datei nicht finden

最后一部分是德语本地化版本“系统无法找到文件。

我不明白为什么一方面文件存在,但另一方面却找不到它。

我潜入了java.lang.ProcessBuilder并发现,Exception实际上是在第189行的java.lang.ProcessImpl.java中抛出的

handle = create(cmdstr, envblock, path,
                    stdHandles, redirectErrorStream);

此异常导致java.lang.ProcessImpl.Start(...)(从第83行开始)关闭try-statement的finally子句中的FileInputStreams和FileOutputStreams。 但是,在调试时我注意到f2.close()(line141)被调用两次,导致抛出异常,然后被解释为未知文件。

我的第一个猜测是一个错误,但我认为我的代码相当微不足道,不应该提出一个未知的错误。

更确切地说,我在代码中犯了一个愚蠢的小错误......

我希望你能读懂我糟糕的英语和糟糕的风格,我不习惯写代码......

感谢任何帮助。

jdk 1.7.0_03

编辑:提及我想要运行的文件是64位可执行文件可能很重要,尽管我将它安装在x86文件夹中。

2 个答案:

答案 0 :(得分:0)

请尝试

new ProcessBuilder(Dir+ExeName, 
     "-monitor=\"PnP-Monitor (Standard)\"", 
     "-detach");

这将解决两件事:

  • 您为可执行文件使用完全限定名称。
  • 你的detachArgument实际上似乎是两个论点。

答案 1 :(得分:-1)

我很确定这可能是问题

pb=pb.directory(new File(Dir));
pb=pb.redirectError(ProcessBuilder.Redirect.INHERIT);
pb=pb.redirectOutput(ProcessBuilder.Redirect.INHERIT);
pb=pb.redirectInput(ProcessBuilder.Redirect.INHERIT);

一个开始pb.directory返回一个java.io.File,这样你只是重定向目录文件的输出?

也许试试这个;

ProcessBuilder pb = new ProcessBuilder(ExeName, DetachArgument);
pb.directory(new File(Dir));

德语为完整性

Im ziemlich sicher,dass die das Problemseinkönnte

 pb = pb.directory (new File (dir));
 pb = pb.redirectError (ProcessBuilder.Redirect.INHERIT);
 pb = pb.redirectOutput (ProcessBuilder.Redirect.INHERIT);
 pb = pb.redirectInput (ProcessBuilder.Redirect.INHERIT);

FüreinenStart pb.directory gibt einen java.io.File so Ihr gerade Umleiten der Ausgabe einer Datei des Verzeichnisses?

Vielleicht versuchen Sie去世;

 ProcessBuilder pb = new ProcessBuilder (EXEName, DetachArgument);
 pb.directory (new File (dir));