如何使用Java打开默认的Web浏览器


Answers:


161

java.awt.Desktop 是您要寻找的课程。

import java.awt.Desktop;
import java.net.URI;

// ...

if (Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) {
    Desktop.getDesktop().browse(new URI("http://www.example.com"));
}

3
这是跨平台解决方案还是仅Windows?此线程中的其他答案建议对Linux使用Runtime类
isapir 2013年

@lgal,它在Windows 7和Linux(Ubuntu 10.10)上都对我有效。它总是打开默认的系统浏览器(就我而言,在Win7上为IE,在Ubuntu上为Firefox)
Joaquim Oliveira 2014年

1
这对我不起作用。IsDesktopSupported方法始终在Windows计算机上返回false。怎么了?
krzysiek.ste 2015年

2
如果用户已将扩展名类似于“ html”的文件分配给自定义“打开方式”操作,则该操作将不会打开浏览器,但是用户已将其链接到的程序...。这根本不是解决方案!
圣徒

4
@ krzysiek.ste使用Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)支票代替。
Thibstars

35

这是我的代码。它将在默认浏览器(跨平台解决方案)中打开给定的url。

import java.awt.Desktop;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

public class Browser {
    public static void main(String[] args) {
        String url = "http://www.google.com";

        if(Desktop.isDesktopSupported()){
            Desktop desktop = Desktop.getDesktop();
            try {
                desktop.browse(new URI(url));
            } catch (IOException | URISyntaxException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }else{
            Runtime runtime = Runtime.getRuntime();
            try {
                runtime.exec("xdg-open " + url);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

2
““ xdg-open”未被识别为内部或外部命令,可操作程序或批处理文件。”
xehpuk

10
多数民众赞成在一个Unix命令。您正在做什么在Windows中运行
Olu Smith

7
与“ Desktop.isDesktopSupported()”一起检查“ Desktop.getDesktop()。isSupported(Action.BROWSE)”。
Kanchu,2013年

35

对我来说,解决方案Desktop.isDesktopSupported()不起作用(Windows 7ubuntu)。请尝试通过Java代码打开浏览器:

视窗:

Runtime rt = Runtime.getRuntime();
String url = "http://stackoverflow.com";
rt.exec("rundll32 url.dll,FileProtocolHandler " + url);

苹果电脑

Runtime rt = Runtime.getRuntime();
String url = "http://stackoverflow.com";
rt.exec("open " + url);

Linux:

Runtime rt = Runtime.getRuntime();
String url = "http://stackoverflow.com";
String[] browsers = { "epiphany", "firefox", "mozilla", "konqueror",
                                 "netscape", "opera", "links", "lynx" };

StringBuffer cmd = new StringBuffer();
for (int i = 0; i < browsers.length; i++)
    if(i == 0)
        cmd.append(String.format(    "%s \"%s\"", browsers[i], url));
    else
        cmd.append(String.format(" || %s \"%s\"", browsers[i], url)); 
    // If the first didn't work, try the next browser and so on

rt.exec(new String[] { "sh", "-c", cmd.toString() });

如果要使用多平台应用程序,则需要添加操作系统检查(例如):

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

视窗:

os.indexOf("win") >= 0

苹果电脑:

os.indexOf("mac") >= 0

Linux:

os.indexOf("nix") >=0 || os.indexOf("nux") >=0

1
为什么在这里使用StringBuffer?
斯蒂芬,

2
列出Linux解决方案中的所有浏览器非常糟糕。如果使用列表中未使用的其他浏览器怎么办?(列表中没有铬,也没有铬)或者Epiphany和Firefox都有,但是更喜欢使用后者?xdg-open在这种情况下,使用会更好。因此,该解决方案可能与macOS一样简单。
m4tx

Windows的另一个选项是rt.exec(“ start \”“ + url +” \“);
Ivan Nikitin,

6

您还可以使用运行时来创建跨平台解决方案:

import java.awt.Desktop;
import java.net.URI;

public class App {

    public static void main(String[] args) throws Exception {
        String url = "http://stackoverflow.com";

        if (Desktop.isDesktopSupported()) {
            // Windows
            Desktop.getDesktop().browse(new URI(url));
        } else {
            // Ubuntu
            Runtime runtime = Runtime.getRuntime();
            runtime.exec("/usr/bin/firefox -new-window " + url);
        }
    }
}

5

正如Tim Cooper提供的答案所指出的那样,java.awt.Desktop自Java版本6(1.6)起提供了此功能,但有以下警告:

使用isDesktopSupported()方法来确定Desktop API是否可用。在Solaris操作系统和Linux平台上,此API依赖于Gnome库。如果这些库不可用,则此方法将返回false。

对于不支持或不提供的平台,请java.awt.Desktop查看BrowserLauncher2项目。它是从最初由Eric Albert编写和发布的BrowserLauncher类派生而来的,并在某种程度上进行了更新。我在一个多平台Java应用程序中成功使用了原始的BrowserLauncher类,该应用程序在2000年代初通过Web浏览器界面在本地运行。

请注意,BrowserLauncher2是根据GNU较宽松通用公共许可证许可的。如果该许可证不可接受,请查找具有非常宽松许可证的原始BrowserLauncher的副本:

该代码是Eric Albert(ejalbert@cs.stanford.edu)的版权1999-2001,可以无限制地以任何形式重新分发或修改,只要该注释从本段到注释结尾的部分没有被删除即可。 。作者要求将使用此代码的任何应用程序,小程序或其他二进制文件都通知他,但这是出于好奇而不是任何事情,因此不是必需的。该软件不包含任何保修。对于使用此软件造成的任何数据或功能丢失或任何不利或意外的影响,作者概不负责。

鸣谢:Steven Spencer,JavaWorld杂志(Java技巧66)还感谢Ron B. Yeh,Eric Shapiro,Ben Engber,Paul Teitlebaum,Andrea Cantatore,Larry Barowski,Trevor Bedzek,Frank Miedrich和Ron Rabakukk

自2001年以来,除了BrowserLauncher2之外的其他项目可能还更新了原始的BrowserLauncher,以解决浏览器的更改和默认系统安全设置。



1
对于那些希望在Mac上使用BrowserLauncher2的用户,原始的BrowserLauncher2或@koppor提到的fork均不能与Mac OS X Sierra一起使用。两者都假定存在“ mrj.version”系统属性,该属性显然不再存在。构造启动器时,该代码将引发NullPointerException。有关其他信息,请参见sourceforge.net/p/browserlaunch2/bugs/14
Coren

4

它非常简单,只需编写以下代码:

String s = "http://www.google.com";
Desktop desktop = Desktop.getDesktop();
desktop.browse(URI.create(s));

或者,如果您不想加载URL,则只需将浏览器名称写成字符串值,例如,

String s = "chrome";
Desktop desktop = Desktop.getDesktop();
desktop.browse(URI.create(s));

执行程序后,它将自动使用空URL打开浏览器


1

在Windows上,调用“ cmd / k start http://www.example.com ”实际上,您始终可以使用start命令调用“默认”程序。例如,abc.mp3将调用默认的mp3播放器并加载请求的mp3文件。


您已经发布了便携式版本。我只是提出了另一种解决方案,如果它不仅仅是您需要在默认程序中打开的URL,那么可以记住这一点。
d-live

1

希望你不介意,但我从上面将所有有用的内容拼凑在一起,并准备了完整的类以供测试...

import java.awt.Desktop;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

public class MultiBrowPop {

    public static void main(String[] args) {
        OUT("\nWelcome to Multi Brow Pop.\nThis aims to popup a browsers in multiple operating systems.\nGood luck!\n");

        String url = "http://www.birdfolk.co.uk/cricmob";
        OUT("We're going to this page: "+ url);

        String myOS = System.getProperty("os.name").toLowerCase();
        OUT("(Your operating system is: "+ myOS +")\n");

        try {
            if(Desktop.isDesktopSupported()) { // Probably Windows
                OUT(" -- Going with Desktop.browse ...");
                Desktop desktop = Desktop.getDesktop();
                desktop.browse(new URI(url));
            } else { // Definitely Non-windows
                Runtime runtime = Runtime.getRuntime();
                if(myOS.contains("mac")) { // Apples
                    OUT(" -- Going on Apple with 'open'...");
                    runtime.exec("open " + url);
                } 
                else if(myOS.contains("nix") || myOS.contains("nux")) { // Linux flavours 
                    OUT(" -- Going on Linux with 'xdg-open'...");
                    runtime.exec("xdg-open " + url);
                }
                else 
                    OUT("I was unable/unwilling to launch a browser in your OS :( #SadFace");
            }
            OUT("\nThings have finished.\nI hope you're OK.");
        }
        catch(IOException | URISyntaxException eek) {
            OUT("**Stuff wrongly: "+ eek.getMessage());
        }
    }

    private static void OUT(String str) {
        System.out.println(str);
    }
}

1

我将上述Brajesh Kumar的回答改写成Clojure,如下所示:

(defn open-browser 
  "Open a new browser (window or tab) viewing the document at this `uri`."
  [uri]
  (if (java.awt.Desktop/isDesktopSupported)
    (let [desktop (java.awt.Desktop/getDesktop)]
      (.browse desktop (java.net.URI. uri)))
    (let [rt (java.lang.Runtime/getRuntime)]
      (.exec rt (str "xdg-open " uri)))))

以防对任何人有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.