代码之家  ›  专栏  ›  技术社区  ›  Allain Lalonde

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

  •  2
  • Allain Lalonde  · 技术社区  · 16 年前

    我一直在使用下面的代码在Java机器上使用Java打开Office文档、PDF等,并且它工作得很好,除了一些原因,当文件名已经在其中嵌入了多个毗连的空间时,比如“文件[Suff[[Sal] ] 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会抱怨找不到该文件。但是…当我直接从命令行运行命令行时,它运行得很好。

    3 回复  |  直到 16 年前
        1
  •  5
  •   Dan Dyer    16 年前

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

        2
  •  0
  •   Matt Cummings    16 年前

    不确定这是否对你有很大帮助…我使用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) {}
    
        3
  •  0
  •   KeithL    16 年前

    问题可能是您使用的“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();
            }
        }
    }