从Java打开文档的更好方法?

从Java打开文档的更好方法?,java,windows,process,Java,Windows,Process,我一直在使用以下代码在我的windows计算机上使用Java打开Office文档、PDF等,它工作正常,但由于某种原因,当文件名将其嵌入多个连续的空间(如“File[SPACE][SPACE]Test.doc”)时除外 我怎样才能做到这一点?我并不反对把整段代码都装进去。。。但我不想用一个调用JNI的第三方库来代替它 public static void openDocument(String path) throws IOException { // Make forward slas

我一直在使用以下代码在我的windows计算机上使用Java打开Office文档、PDF等,它工作正常,但由于某种原因,当文件名将其嵌入多个连续的空间(如“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);            
}

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

如果您使用的是Java 6,则可以使用当前平台的默认应用程序启动文件。

不确定这是否会对您有很大帮助。。。我使用Java1.5+在java程序中启动外部shell脚本。基本上我是这样做的:(虽然这可能不适用,因为您不想捕获命令输出;您实际上想启动文档-但是,这可能会激发一些您可以使用的东西)

List命令=新建ArrayList();
添加(一些可执行文件);
add(someArguemnt0);
添加(1);
command.add(someArgument2);
ProcessBuilder=新的ProcessBuilder(命令);
试一试{
最终流程=builder.start();
...    
}捕获(ioe异常ioe){}
问题可能是您正在使用的“开始”命令,而不是您的文件名解析。例如,这在我的WinXP机器(使用JDK1.5)上似乎运行良好


确认您正在使用C:\\so\\My[space][space]Doc.Doc,对吗?
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) {}
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();
        }
    }
}