Я использую следующий код, чтобы открывать документы Office, PDF и т. д. На моих компьютерах с Windows, используя Java, и он работает нормально, за исключением некоторых причин, когда имя файла встроило его в несколько смежных пробелов, таких как «Файл [ПРОБЕЛ] [ ПРОБЕЛ] Test.doc ".
Как я могу заставить это работать? Я не прочь сохранить весь код целиком ... но я бы не стал заменять его сторонней библиотекой, которая вызывает JNI.
public static void openDocument(String path) throws IOException {
// Make forward slashes backslashes (for windows)
// Double quote any path segments with spaces in them
path = path.replace("/", "\").replaceAll(
"\\([^\\\\\"]* [^\\\\\"]*)", "\\\\"\"");
String command = "C:\Windows\System32\cmd.exe /c start " + path + "";
Runtime.getRuntime().exec(command);
}
Обновлено: Когда я запускаю его с ошибочными окнами файла, он жалуется на обнаружение файла. Но ... когда я запускаю командную строку прямо из командной строки, она работает нормально.




Если вы используете Java 6, вы можете просто использовать открытый метод java.awt.Desktop для запуска файла, используя приложение по умолчанию для текущей платформы.
Не уверен, что это вам сильно поможет ... Я использую ProcessBuilder для java 1.5+ для запуска внешних сценариев оболочки в java-программе. В основном я делаю следующее: (хотя это может не применяться, потому что вы не хотите фиксировать вывод команд; вы действительно хотите запустить документ, но, возможно, это вызовет что-то, что вы можете использовать)
List<String> command = new ArrayList<String>();
command.add(someExecutable);
command.add(someArguemnt0);
command.add(someArgument1);
command.add(someArgument2);
ProcessBuilder builder = new ProcessBuilder(command);
try {
final Process process = builder.start();
...
} catch (IOException ioe) {}
Проблема может заключаться в используемой вами команде "start", а не в разборе имени файла. Например, похоже, что это хорошо работает на моей машине WinXP (с использованием JDK 1.5)
import java.io.IOException;
import java.io.File;
public class test {
public static void openDocument(String path) throws IOException {
path = "\"" + path + "\"";
File f = new File( path );
String command = "C:\Windows\System32\cmd.exe /c " + f.getPath() + "";
Runtime.getRuntime().exec(command);
}
public static void main( String[] argv ) {
test thisApp = new test();
try {
thisApp.openDocument( "c:\so\My Doc.doc");
}
catch( IOException e ) {
e.printStackTrace();
}
}
}
Просто чтобы подтвердить, что вы используете C: \\ so \\ My [space] [space] Doc.doc, верно?