我正在使用Java 1.5,我想启动相关的应用程序来打开文件.我知道Java 1.6引入了Desktop API,但我需要一个Java 1.5的解决方案.
到目前为止,我找到了一种在Windows中执行此操作的方法:
Runtime.getRuntime().exec(new String[]{ "rundll32", "url.dll,FileProtocolHandler", fileName });
有没有跨平台的方式来做到这一点?或者至少是Linux的类似解决方案?
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中提供类似桌面功能的库.
这个答案 +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 /粘贴你可能会忘记更改命令来执行)
同样是一个补充:而不是gnome-open
使用xdg-open
.它是XdgUtils的一部分,它们又是LSB Desktop支持包的一部分(从3.2开始).
您可以(应该)仍然使用gnome-open
作为后备,但xdg-open
也可以在非GNOME桌面上使用.