Лучший способ открыть документ с Java?
Вопрос
Я использовал следующий код для открытия документов Office, PDF и т. д.на моих машинах с Windows, использующих Java, и он работает нормально, за исключением того, что по какой-то причине имя файла включает в себя несколько смежных пространств, например «File[SPACE][SPACE]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(
"\\\\([^\\\\\\\\\"]* [^\\\\\\\\\"]*)", "\\\\\\\"$1\"");
String command = "C:\\Windows\\System32\\cmd.exe /c start " + path + "";
Runtime.getRuntime().exec(command);
}
РЕДАКТИРОВАТЬ: Когда я запускаю его с ошибочным файлом, окна жалуются на обнаружение файла.Но...когда я запускаю командную строку непосредственно из командной строки, она работает нормально.
Решение
Если вы используете Java 6, вы можете просто использовать открытый метод java.awt.Desktop для запуска файла с использованием приложения по умолчанию для текущей платформы.
Другие советы
Не уверен, что это вам сильно поможет...Я использую Java 1.5+ ProcessBuilder для запуска внешних сценариев оболочки в 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) {}
Проблема может быть в используемой вами команде «Пуск», а не в синтаксическом анализе имени файла.Например, похоже, это хорошо работает на моей машине с 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();
}
}
}