为什么Java的URL类不能识别某些协议?

mefy6pfw  于 2023-03-11  发布在  Java
关注(0)|答案(5)|浏览(171)
URL u=new URL("telnet://route-server.exodus.net");

此行将生成:

java.net.MalformedURLException: unknown protocol: telnet

我也遇到了类似的问题,与其他网址开始“新闻://”
这些都是从ODP中提取的URL,所以我不明白为什么会出现这样的例外。

ev7lccsx

ev7lccsx1#

问题

Java抛出MalformedURLException,因为它找不到该协议的URLStreamHandler。请检查构造函数的javadocs以了解详细信息。

总结

由于URL类有一个openConnection方法,URL类会检查以确保Java知道如何打开正确协议的连接,如果没有URLStreamHandler协议,Java将拒绝创建URL,保存您在尝试调用openConnection时失败。

溶液

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

qvtsj1bj

qvtsj1bj2#

听起来你的应用程序中没有为“telnet”协议注册的处理程序。因为URL类可以用来打开一个InputStream到URL,所以如果你被允许使用它创建一个对象,它需要为协议注册一个处理程序来完成这项工作。
有关如何添加处理程序的详细信息,请参阅:http://docs.oracle.com/javase/7/docs/api/java/net/URLStreamHandlerFactory.html

4uqofj5v

4uqofj5v3#

你会得到那个错误,因为java没有一个标准的protocol handler用于telnet。

5lhxktic

5lhxktic4#

简单的答案是,它只识别某些协议,而剩余的无限协议是无法识别的。

8ulbf1ek

8ulbf1ek5#

如果图像URL以“data”开头,则意味着图像数据嵌入在HTML页面本身,而不是存储在可以通过URL访问的远程服务器上,因此无法使用标准HTTP连接下载图像,所以base64机制帮助了我们。
图片来源URL:数据:图像/png;base64,iV输入0 KGgoAAAAN输出0 KGgoAAAAN输入0 KGAUN输入0 KGgoAAAAN输出0 KGAUN输入0 KGgoAAAAN输出0 KGAUN输入0 KGgoAAAAN输入0 KGAUN输入0 KGgoAAAAN输出0 KGAUN输入0 KGAUN输入0 KGgoAAAAN输出0 KGAUN输入0 KGAUN输入0 KGgoCC输出0 KGAUN输出
要下载映像,可以使用以下代码:

// 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编码的数据组件。然后,在解码base64编码的图像数据后,根据MIME类型确定文件扩展名,并将图像保存到磁盘上的文件中。请注意,您需要处理解码和文件I/O过程中可能发生的任何异常。
要使用这段代码,除了我在前面的回答中提到的类之外,您还需要导入以下类:

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

Base64类用于解码base64编码的图像数据,java.io.File类用于表示磁盘上的输出文件。
我希望这能帮助到一些人!

相关问题