2

我一直在使用以下代码在我的 Windows 机器上使用 Java 打开 Office 文档、PDF 等,它工作正常,除了文件名将其嵌入多个连续空格(如“文件 [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);            
}

编辑:当我用错误的文件运行它时,窗口抱怨找不到文件。但是......当我直接从命令行运行命令行时,它运行得很好。

4

3 回答 3

5

如果您使用的是 Java 6,您可以使用java.awt.Desktop 的 open 方法使用当前平台的默认应用程序启动文件。

于 2008-09-10T18:36:43.727 回答
0

不确定这是否对您有很大帮助...我使用 java 1.5+ 的ProcessBuilder 在 java 程序中启动外部 shell 脚本。基本上我执行以下操作:(尽管这可能不适用,因为您不想捕获命令输出;您实际上想启动文档 - 但是,也许这会激发您可以使用的东西)

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) {}
于 2008-09-10T18:52:49.803 回答
0

问题可能是您正在使用的“开始”命令,而不是您的文件名解析。例如,这似乎在我的 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();
        }
    }
}
于 2008-09-10T19:09:38.857 回答