может быть, я немного наивен, но я думаю, что это не должно вести себя таким образом.
Сначала мой код:
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 на самом деле выдается в java.lang.ProcessImpl.java в строке 189.
handle = create(cmdstr, envblock, path,
stdHandles, redirectErrorStream);
Это исключение приводит к тому, что java.lang.ProcessImpl.Start(...) (начиная со строки 83) закрывает потоки FileInputStream и FileOutputStreams в предложении finally для оператора try. Однако во время отладки я заметил, что f2.close() (строка 141) вызывается дважды, что приводит к возникновению исключения, которое затем интерпретируется как неизвестный файл.
Мое первое предположение было бы ошибкой, но я думаю, что мой код довольно тривиален и не должен вызывать неизвестную ошибку.
Скорее всего, я сделал небольшую глупую ошибку в своем коде в первую очередь....
Надеюсь, вы понимаете мой плохой английский и мой плохой стиль, я не привык писать о коде...
Любая помощь приветствуется.
JDK 1.7.0_03
изменить: может быть важно упомянуть, что файл, который я хочу запустить, является 64-битным исполняемым файлом, хотя я установил его в папку x86.
new ProcessBuilder(Dir+ExeName, ...)
сообщение? - person A.H.   schedule 25.03.2012