为什么Java的URL类无法识别某些协议?

34
URL u=new URL("telnet://route-server.exodus.net");

这一行代码产生了:

java.net.MalformedURLException: unknown protocol: telnet

我遇到了另外一些以"news://"开头的 URL,也出现了类似的问题。

这些 URL 是从 ODP 中提取的,所以我不明白为什么会出现这样的异常情况。


感谢大家,我学到了新东西。 - trinity
5个回答

56

问题

Java抛出MalformedURLException异常,因为它找不到该协议的URLStreamHandler。请查看构造函数的javadocs获取更多详细信息。

总结

由于URL类具有openConnection方法,因此URL类会检查Java是否知道如何打开正确协议的连接。如果没有该协议的URLStreamHandler,则Java拒绝创建URL,以免在您尝试调用openConnection时失败。

解决方案

如果您不打算在Java中打开这些协议的连接,则应该使用URI类。


或者,一个人可以实现自己的URLStreamHandler。 - om-nom-nom
2
非常感谢。URI类对我来说是解决方案。 - Liuting
我还能发送数据吗(使用URI)? - Lealo

3

2

2
简单来说,它只能识别某些协议,而其余无限数量的协议则无法被识别。

1

如果图像URL以"data"开头,则意味着图像数据嵌入在HTML页面中,而不是存储在可以通过URL访问的远程服务器上。因此,您无法使用标准HTTP连接下载图像。因此,base64机制对我们有所帮助。

图像源URL:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAWAUNoinFRBWASIUA........AAAAElFTkSuQmCC

要下载图像,可以使用以下代码:

// Get the image source data
String imageData = webElement.getAttribute("src");

// Extract the image data and file extension from the data URL
String[] parts = imageData.split(",");
String mimeType = parts[0].split(":")[1];
String base64Data = parts[1];
String fileExtension = "";

if (mimeType.equals("image/jpeg")) {
    fileExtension = ".jpg";
} else if (mimeType.equals("image/png")) {
    fileExtension = ".png";
} else if (mimeType.equals("image/gif")) {
    fileExtension = ".gif";
} else {
    // Unsupported image format
    throw new IOException("Unsupported image format");
}

// Set the output file path and stream. Here, we save the image file.
String outputPath = "C:/images/image" + fileExtension;
FileOutputStream outputStream = new FileOutputStream(outputPath);

// Close the output stream
outputStream.close();

这段代码首先从"data" URL中提取图像数据,并将其分割成MIME类型和base64编码的数据组件。然后根据MIME类型确定文件扩展名,并在解码base64编码的图像数据后将图像保存到磁盘上的文件中。请注意,在解码和文件I/O过程中可能会出现任何异常,您需要处理这些异常。

要使用此代码,除了我在之前的答案中提到的类之外,还需要导入以下类:

import java.io.File;
import java.util.Base64;

java.util.Base64类用于解码base64编码的图像数据。java.io.File类用于表示磁盘上的输出文件。

我希望这可以帮助到某些人!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接