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

我正在使用Java 1.5,我想启动关联的应用程序来打开文件。 我知道Java 1.6引入了桌面API ,但是我需要Java 1.5的解决scheme。

到目前为止,我在Windows中find了一个方法:

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

是否有跨平台的方式来做到这一点? 或者至less有一个类似的Linux解决scheme?

Solutions Collecting From Web of "使用Java 1.5打开文件的跨平台方法"

+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 <file> } public void imaginaryAction( File file ){ // Runtime.getRuntime().exec:gnome-something-else <file> } } class KdeDesktop extends Desktop{ public void open( File file ){ // Runtime.getRuntime().exec: kfmclient exec <file> } public void imaginaryAction( File file ){ // Runtime.getRuntime().exec: kfm-imaginary.sh <file> } } class OSXDesktop extends Desktop{ public void open( File file ){ // Runtime.getRuntime().exec: open <file> } public void imaginaryAction( File file ){ // Runtime.getRuntime().exec: wow!! <file> } } class WindowsDesktop extends Desktop{ public void open( File file ){ // Runtime.getRuntime().exec: cmd /c start <file> } 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 <file> } public void imaginaryAction( File file){ //Runtime.getRuntime().exec: command.com /C otherCommandHere <file> } } 

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

做这种方法,可能会删除不需要的if / elseif / else构造,随着时间的推移可能会引入错误(如果在代码中有6个这样的变化,而且需要更改,您可能会忘记更新其中之一,或者通过复制/粘贴你可能会忘记更改命令执行)

 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)); } 

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

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

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

SWT为您提供了通过以下途径让标准程序打开文件的可能性:

 final Program p = Program.findProgram(fileExtension); p.execute(file.getAbsolutePath()); 

严格来说这不是跨平台的,因为SWT是依赖于平台的,但是对于每个平台你都可以使用不同的SWT jar。

您可以使用操作系统的默认方式为您打开它。

  • Windows:“cmd / c 文件名
  • Linux w / gnome“gnome-open filename
  • Linux w / Kde?
  • OSx“打开文件名

另一个答案(由boutta)建议使用SWT。 我不建议仅为此目的引用库,但是如果您已经使用它,只需执行:

 Program.launch("http://google.com/"); 

请注意,如果已经创建了一个Display对象(例如通过创建一个Shell ),则此方法将仅工作(并返回true )。 还要注意它必须在主线程中运行; 例如:

 Display.syncExec(new Runnable() { public void run() { Program.launch("http://google.com/"); } }); 

在上面的例子中,我已经启动了一个URL,但启动文件的方式也是一样的。

我们确实把这个命令放在配置文件的某处。

你的“JAR和源代码”将是“跨平台的”,但你的部署不是。

你也可以做这样的回答 。 您可以将“Deskop”实现的工厂类的类名放入设置文件中。 (如果你喜欢,可以是导游或春季)