当前位置:  开发笔记 > 编程语言 > 正文

使用Java 1.5打开文件的跨平台方式

如何解决《使用Java1.5打开文件的跨平台方式》经验,为你挑选了4个好方法。

我正在使用Java 1.5,我想启动相关的应用程序来打开文件.我知道Java 1.6引入了Desktop API,但我需要一个Java 1.5的解决方案.

到目前为止,我找到了一种在Windows中执行此操作的方法:

Runtime.getRuntime().exec(new String[]{ "rundll32", 
                          "url.dll,FileProtocolHandler", fileName });

有没有跨平台的方式来做到这一点?或者至少是Linux的类似解决方案?



1> 小智..:
public static boolean isWindows() {
    String os = System.getProperty("os.name").toLowerCase();
    return os.indexOf("windows") != -1 || os.indexOf("nt") != -1;
}
public static boolean isMac() {
    String os = System.getProperty("os.name").toLowerCase();
    return os.indexOf("mac") != -1;
}
public static boolean isLinux() {
    String os = System.getProperty("os.name").toLowerCase();
    return os.indexOf("linux") != -1;
}
public static boolean isWindows9X() {
    String os = System.getProperty("os.name").toLowerCase();
    return os.equals("windows 95") || os.equals("windows 98");
}

 if (isLinux())
  {
     cmds.add(String.format("gnome-open %s", fileName));
     String subCmd = (exec) ? "exec" : "openURL";
     cmds.add(String.format("kfmclient "+subCmd+" %s", fileName));
  }
  else if (isMac())
  {
     cmds.add(String.format("open %s", fileName));
  }
  else if (isWindows() && isWindows9X())
  {
     cmds.add(String.format("command.com /C start %s", fileName));
  }
  else if (isWindows())
  {
     cmds.add(String.format("cmd /c start %s", fileName));
  }



2> Dan Vinton..:

JDIC是一个在Java 1.5中提供类似桌面功能的库.



3> OscarRyz..:

这个答案 +1

另外,我建议使用多态的以下实现:

这样,您可以通过减少类之间的耦合来更轻松地添加新平台.

客户代码:

 Desktop desktop = Desktop.getDesktop();

 desktop.open( aFile );
 desktop.imaginaryAction( aFile );

桌面impl:

package your.pack.name;

import java.io.File;

public class Desktop{

    // hide the constructor.
    Desktop(){}

    // Created the appropriate instance
    public static Desktop getDesktop(){

        String os = System.getProperty("os.name").toLowerCase();

        Desktop desktop = new Desktop();
         // This uf/elseif/else code is used only once: here
        if ( os.indexOf("windows") != -1 || os.indexOf("nt") != -1){

            desktop = new WindowsDesktop();

        } else if ( os.equals("windows 95") || os.equals("windows 98") ){

            desktop = new Windows9xDesktop();

        } else if ( os.indexOf("mac") != -1 ) {

            desktop = new OSXDesktop();

        } else if ( os.indexOf("linux") != -1 && isGnome() ) {

            desktop = new GnomeDesktop();

        } else if ( os.indexOf("linux") != -1 && isKde() ) {

            desktop = new KdeDesktop();

        } else {
            throw new UnsupportedOperationException(String.format("The platform %s is not supported ",os) );
        }
        return desktop;
    }

    // default implementation :( 
    public void open( File file ){
        throw new UnsupportedOperationException();
    }

    // default implementation :( 
    public void imaginaryAction( File file  ){
        throw new UnsupportedOperationException();
    }
}

// One subclass per platform below:
// Each one knows how to handle its own platform   


class GnomeDesktop extends Desktop{

    public void open( File file ){
        // Runtime.getRuntime().exec: execute gnome-open 
    }

    public void imaginaryAction( File file ){
        // Runtime.getRuntime().exec:gnome-something-else 
    }

}
class KdeDesktop extends Desktop{

    public void open( File file ){
        // Runtime.getRuntime().exec: kfmclient exec 
    }

    public void imaginaryAction( File file ){
        // Runtime.getRuntime().exec: kfm-imaginary.sh  
    }
}
class OSXDesktop extends Desktop{

    public void open( File file ){
        // Runtime.getRuntime().exec: open 
    }

    public void imaginaryAction( File file ){
        // Runtime.getRuntime().exec: wow!! 
    }
}
class WindowsDesktop extends Desktop{

    public void open( File file ){
        // Runtime.getRuntime().exec: cmd /c start 
    }

    public void imaginaryAction( File file ){
        // Runtime.getRuntime().exec: ipconfig /relese /c/d/e
    }
}
class Windows9xDesktop extends Desktop{

    public void open( File file ){
        //Runtime.getRuntime().exec: command.com /C start 
    }

    public void imaginaryAction( File file){
       //Runtime.getRuntime().exec: command.com /C otherCommandHere 
    }
}

这只是一个例子,在现实生活中不值得创建一个新类只是为了参数化一个值(命令字符串%s)但是让我们想象每个方法以特定于平台的方式执行另一个步骤.

采取这种方法,可能会删除不需要的if/elseif/else结构,随着时间的推移可能会引入错误(如果代码中有6个并且更改是neede,您可能忘记更新其中一个,或者通过copy /粘贴你可能会忘记更改命令来执行)



4> Torsten Mare..:

同样是一个补充:而不是gnome-open使用xdg-open.它是XdgUtils的一部分,它们又是LSB Desktop支持包的一部分(从3.2开始).

您可以(应该)仍然使用gnome-open作为后备,但xdg-open也可以在非GNOME桌面上使用.

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有