【问题标题】:How to open the default webbrowser using java如何使用java打开默认的webbrowser
【发布时间】:2011-03-07 22:48:14
【问题描述】:

有人能给我指出如何打开默认网络浏览器并将页面设置为“www.example.com”的正确方向吗

【问题讨论】:

标签: java


【解决方案1】:

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

【讨论】:

  • 这是跨平台解决方案还是仅限 Windows?此线程中的其他答案建议使用 Linux 的 Runtime 类
  • 这对我不起作用。 IsDesktopSupported 方法在我的 Windows 机器上总是返回 false。怎么了?
  • 如果用户为文件扩展分配了一个自定义的“打开方式”操作,如“html”,那么这将不会打开浏览器,但用户已将其链接到的程序......这个根本不是解决方案!
  • @krzysiek.ste 请改用Desktop.getDesktop().isSupported(Desktop.Action.BROWSE) 检查。
  • @thesaint 如果用户更改了 html 文件的处理程序,那么这就是用户希望 html 文件的默认浏览器成为的样子,所以这正是问题所要求的。
【解决方案2】:

对我来说,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 = { "google-chrome", "firefox", "mozilla", "epiphany", "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

【讨论】:

  • 为什么在这里使用 StringBuffer?
  • 列出 Linux 解决方案中的所有浏览器是非常糟糕的。如果使用列表中的任何其他浏览器怎么办? (列表中没有 chrome 和 chromium)或者同时拥有 Epiphany 和 Firefox,但更喜欢使用后者?在这种情况下,使用 xdg-open 会好得多。因此,解决方案可以像 macOS 一样简单。
  • Windows 的另一个选项是 rt.exec("start \"" + url +"\");
【解决方案3】:

这是我的代码。它将在默认浏览器中打开给定的 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();
            }
        }
    }
}

【讨论】:

  • "'xdg-open' 未被识别为内部或外部命令、可运行程序或批处理文件。"
  • 这是一个 unix 命令。你在 Windows 上运行它做什么
  • 与“Desktop.isDesktopSupported()”一起检查“Desktop.getDesktop().isSupported(Action.BROWSE)”。
【解决方案4】:

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

Use the isDesktopSupported() method to determine whether the Desktop API is available. On the Solaris Operating System and the Linux platform, this API is dependent on Gnome libraries. If those libraries are unavailable, this method will return false.

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

请注意,BrowserLauncher2 在GNU Lesser General Public License 下获得许可。如果该许可证不可接受,请查找具有非常宽松许可证的原始 BrowserLauncher 的副本:

此代码是 Eric Albert (ejalbert@cs.stanford.edu) 的版权所有 1999-2001,并且可以不受限制地以任何形式重新分发或修改,只要此评论的部分从本段到评论末尾没有被删除。作者要求通知他使用此代码的任何应用程序、applet 或其他二进制文件,但这更多是出于好奇而不是必需的。本软件不提供任何担保。作者对任何数据或功能丢失或使用此软件的任何不利或意外影响概不负责。

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

BrowserLauncher2 以外的项目也可能更新了原始 BrowserLauncher,以应对自 2001 年以来浏览器和默认系统安全设置的更改。

【讨论】:

  • BrowserLauncher2 的维护分支位于github.com/rajing/browserlauncher2
  • 对于那些希望在 Mac 上使用 BrowserLauncher2 的人来说,原始 BrowserLauncher2 或 @koppor 提到的 fork 都不适用于 Mac OS X Sierra。两者都假设存在显然不再存在的“mrj.version”系统属性。构建启动器时,代码将抛出 NullPointerException。有关更多信息,请参阅sourceforge.net/p/browserlaunch2/bugs/14
【解决方案5】:

您还可以使用 Runtime 创建跨平台解决方案:

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

【讨论】:

  • /usr/bin/firefox 不是非 Windows 平台上的标准浏览器名称!它可能是 Chrome、Epiphany 或许多其他浏览器。
【解决方案6】:

希望你不介意,但我从上面拼凑了所有有用的东西,并提出了一个完整的课程,准备好进行测试......

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

【讨论】:

    【解决方案7】:

    很简单,写下面的代码:

    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打开浏览器

    【讨论】:

      【解决方案8】:

      我将上面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)))))
      

      如果它对任何人有用。

      【讨论】:

        【解决方案9】:

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

        【讨论】:

        • 您已经发布了便携版。我刚刚提出了 另一个 解决方案,如果它不仅仅是您需要在默认程序中打开的 url,请记住它。
        猜你喜欢
        • 2018-04-17
        • 2011-01-13
        • 2012-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-30
        • 2014-09-30
        相关资源
        最近更新 更多