如何使用 java 打开默认浏览器

谁能告诉我如何打开默认的网页浏览器并将页面设置为 “ www.example.com”,谢谢

183742 次浏览

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

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

你也可以使用 运行时间来创建一个跨平台的解决方案:

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

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

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

正如 Tim Cooper 提供的答案中所指出的,java.awt.Desktop从 Java 版本6(1.6)开始就提供了这种功能,但有以下警告:

使用 isDesktopSupport ()方法确定是否可以使用 DesktopAPI。在 Solaris 和 Linux 平台上,这个 API 依赖于 Gnome 库。如果这些库不可用,则此方法将返回 false。

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

请注意,BrowserLauncher2是在 GNU宽通用公共许可证下授权的。如果该许可证是不可接受的,那么寻找一个原始的 BrowserLauncher 的副本,它有一个非常开放的许可证:

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

图片来源: Steven Spencer,《 JavaWorld 》杂志(JavaTip 66) 还要感谢 Ron B。 Yeh,Eric Shapiro,Ben Engber,Paul Teitlebaum,Andrea Cantatore,Larry Barowski,Trevor Bedzek,Frank Miedrich 和 Ron Rabakukk

BrowserLauncher2以外的项目可能还更新了原来的 BrowserLauncher,以考虑自2001年以来浏览器和默认系统安全设置的变化。

对我来说,使用 Desktop.isDesktopSupported()的解决方案不起作用(视窗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

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

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 后,执行一个程序

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

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

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

以防对任何人有用。

JavaFX 在其 StandaloneHostService中打包了一个独立于 AWT 的跨平台解决方案,这在某种程度上与 krzysiek.ste 的答案相似。

我重写了它,以包括一些 xdg-open替代品(这实际上是由 xdg-open使用的方式)。

private static final String[][] commands = new String[][]{
{"xdg-open", "$1"},
{"gio", "open", "$1"},
{"gvfs-open", "$1"},
{"gnome-open", "$1"},  // Gnome
{"mate-open", "$1"},  // Mate
{"exo-open", "$1"},  // Xfce
{"enlightenment_open", "$1"},  // Enlightenment
{"gdbus", "call", "--session", "--dest", "org.freedesktop.portal.Desktop",
"--object-path", "/org/freedesktop/portal/desktop",
"--method", "org.freedesktop.portal.OpenURI.OpenURI",
"", "$1", "{}"},  // Flatpak
{"open", "$1"},  // Mac OS fallback
{"rundll32", "url.dll,FileProtocolHandler", "$1"},  // Windows fallback
};

下面是最后的 Java 代码片段,避免了字符串串联和转义字符问题。

public static void showDocument(final String uri) {
String osName = System.getProperty("os.name");
try {
if (osName.startsWith("Mac OS")) {
Runtime.getRuntime().exec(new String[]{"open", uri});
} else if (osName.startsWith("Windows")) {
Runtime.getRuntime().exec(new String[]{"rundll32", "url.dll,FileProtocolHandler", uri});
} else { //assume Unix or Linux
new Thread(() -> {
try {
for (String[] browser : commands) {
try {
String[] command = new String[browser.length];
for (int i = 0; i < browser.length; i++)
if (browser[i].equals("$1"))
command[i] = uri;
else
command[i] = browser[i];
if (Runtime.getRuntime().exec(command).waitFor() == 0)
return;
} catch (IOException ignored) {
}
}
String browsers = System.getenv("BROWSER") == null ? "x-www-browser:firefox:iceweasel:seamonkey:mozilla:" +
"epiphany:konqueror:chromium:chromium-browser:google-chrome:" +
"www-browser:links2:elinks:links:lynx:w3m" : System.getenv("BROWSER");
for (String browser : browsers.split(":")) {
try {
Runtime.getRuntime().exec(new String[]{browser, uri});
return;
} catch (IOException ignored) {
}
}
} catch (Exception ignored) {
}
}).start();
}
} catch (Exception e) {
// should not happen
// dump stack for debug purpose
e.printStackTrace();
}
}

还有

BrowserUtil.browse(uri);

(源代码) ,似乎是一个更兼容的一些异国情调的设置。我最近有一个客户,Desktop.getDesktop().browse(uri)在 Fedora Linux 中失败了,但是 BrowserUtil.browse(uri)起作用了。

我也相信这是现在 JetBrains 打开浏览器的首选方式(例如,参见 这根线)

由于我遇到了同样的问题,而且没有找到合适的解决方案,所以我将 https://www.npmjs.com/package/open npm 包移植到 Javahttps://github.com/vaadin/open,并将其发布到 Maven 中心。可以用作

<dependency>
<groupId>com.vaadin</groupId>
<artifactId>open</artifactId>
<version>8.4.0.2</version>
</dependency>
Open.open("https://stackoverflow.com/")

或特定的浏览器

Open.open("https://stackoverflow.com/", App.FIREFOX);