现在的位置: 首页 > 综合 > 正文

JDK 1.6中有一个Desktop API打开外部程序

2018年09月17日 ⁄ 综合 ⁄ 共 3469字 ⁄ 字号 评论关闭
原来GUI界面MailClient中加入了类似OutLook的URL跳转支持,用的Runtime接口.执行cmd来启动浏览器打开链接.这样当然有很缺点了.依赖操作系统也可能会出现一些不安全问题.所以刚才上网查了一下Java
SE 6.0的新功能.以前Java SE 6.0刚推出的时候看过新功能的资料.但是当时只用了一个Tray工具栏图标.其他的只是大概知道了他们的存在.

现在又看了一次介绍.本来刚才只发现用System.getProperties()可以获取系统信息.包括 JDK路径,系统版本等等信息.我需要的是System.getProperty("sun.desktop")获取系统类型,因为我用的是Windows操作系统,所以返回的String为windows.用System.getProperty("os.name")可以获取更详细的一些信息,我得到的结果为windows
xp

现在给大家推荐一些我认为有些作用的字段
user.home 可以获取当前用户的主目录
java.specification.version 获取当前JDK的版本号
java.class.path 获取classpath
user.name 获取当前用户名
java.home 获取JDK路径
sun.os.patch.level 获取系统版本号..也可以说是补丁号 我的显示为Service Pack 2
user.dir 当前程序的主目录
os.arch 显示系统操作系统的类型 我的显示为X86
os.version 显示系统内部版本号
java.io.tmpdir 显示当前系统的临时目录
后来发现Java SE 6.0的新功能比这样先判断操作系统类型再执行特定操作方便多了.因为java.awt.Desktop类的 java.awt.Desktop.isDesktopSupported()可以获取当前系统是否支持java awt桌面扩展.如果支持可以获取当前系统的Desktop
java.awt.Desktop dp = java.awt.Desktop.getDesktop();
dp.browse(java.net.URI);
就可以启动系统默认的浏览器,所以也就解决了跨平台的问题.下面是示例代码:

public class TestSystem {
    public static void main(String[] args) {
        //判断当前系统是否支持Java AWT Desktop扩展
        if(java.awt.Desktop.isDesktopSupported()){
            try {
                //创建一个URI实例
                java.net.URI uri = java.net.URI.create("http://www.163.com/");
                //获取当前系统桌面扩展
                java.awt.Desktop dp = java.awt.Desktop.getDesktop();
                //判断系统桌面是否支持要执行的功能
                if(dp.isSupported(java.awt.Desktop.Action.BROWSE)){
                    //获取系统默认浏览器打开链接
                    dp.browse(uri);   
                }
            } catch(java.lang.NullPointerException e){
                //此为uri为空时抛出异常
            } catch (java.io.IOException e) {
                //此为无法获取系统默认浏览器
            }            
        }
    }
}

 

 

在Java代码中调用默认浏览器打开某个网址(常常见于在应用程序中点击某个链接,然后转到某个网页):

在JDK 1.5及之前的版本中是这样实现的:

//JDK 1.5或之前版本

public static void openURL(String url) {  

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

        try {  

            if (osName.startsWith("Mac")) {//Mac OS  

                Class fileMgr = Class.forName("com.apple.eio.FileManager");  

                Method openURL = fileMgr.getDeclaredMethod("openURL",  

                        new Class[]{String.class});  

                openURL.invoke(null, new Object[]{url});  

            } else if (osName.startsWith("Windows")) {//Windows  

                Runtime.getRuntime().exec(  

                        "rundll32 url.dll,FileProtocolHandler " + url);  

            } else {   //Unix   or   Linux  

                String[] browsers = {"firefox", "opera", "konqueror",  

                    "epiphany", "mozilla", "netscape"};  

                String browser = null;  

                for (int count = 0; count < browsers.length && browser == null; count++) {  

                    if (Runtime.getRuntime().exec(  

                            new String[]{"which", browsers[count]}).waitFor() == 0) {  

                        browser = browsers[count];  

                    }  

                }  

                if (browser == null) {  

                    throw new Exception("Could not find web browser");  

                } else {  

                    Runtime.getRuntime().exec(new String[]{browser, url});  

                }  

            }  

        } catch (Exception ex) {  

            ex.printStackTrace();  

        }  

    } 

而在JDK 1.6中有一个Desktop API,使用的方法如:

Desktop desktop = Desktop.getDesktop();

if (Desktop.isDesktopSupported()

&& desktop.isSupported(Desktop.Action.BROWSE)) { //必须判断是否支持

URI uri = new URI(webSite);

desktop.browse(uri);

}

不过这个会出现如下异常,貌似是Java的bug。

Exception in thread "main" java.io.IOException: Failed to open http://baidu.com.cn. Error message: 系统找不到指定的文件。

 

其他用到Desktop API的场景如用默认程序打开和编辑文件、打开邮件编辑程序等等。

方法都很简单,如下:

Desktop desktop = Desktop.getDesktop();

if (Desktop.isDesktopSupported()

&& desktop.isSupported(Desktop.Action.BROWSE)) { //必须判断是否支持

   desktop.open(File file);  //使用默认程序打开文件,比如mp3用千千静听打开

   desktop.edit(File file);   //使用默认程序编辑文件

   desktop.mail();              //打开发送邮件程序

   desktop.mail(mailtoURI);//使用默认邮件程序发送邮件

}

抱歉!评论已关闭.