gpt4 book ai didi

java - 为什么我应该使用 url.openStream 而不是 url.getContent?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:46:05 28 4
gpt4 key购买 nike

我想检索 url 的内容。类似于 python :

html_content = urllib.urlopen("http://www.test.com/test.html").read()

在示例 ( java2s.com ) 中,您经常会看到以下代码:

URL url = new URL("http://www.test.com/test.html");
String foo = (String) url.getContent();

getContent 的描述如下:

Gets the contents of this URL. This method is a shorthand for: openConnection().getContent()
Returns: the contents of this URL.

在我看来,这应该可以很好地工作。但显然这段代码不起作用,因为它引发了一个错误:

Exception in thread "main" java.lang.ClassCastException: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream cannot be cast to java.lang.String

显然它返回一个 inputStream。

所以我问自己:这个函数的目的是什么,它没有做它看起来做的事情?为什么在文档中没有提示它有怪癖?为什么我在几个例子中看到了它?

还是我理解错了?

建议的解决方案 ( stackoverflow ) 是使用 url.openStream() 然后读取 Stream。

最佳答案

正如您所说,文档说 URL.getContent()openConnection().getContent() 的快捷方式,因此我们需要查看 the documentation for URLConnection.getContent() .

我们可以看到这会返回一个Object,其类型由响应的content-type header 字段确定。此类型确定 ContentHandler那将被使用。因此,ContentHandler 根据其 MIME 类型将数据转换为适当的 Java 对象类。

换句话说,您获得的对象类型将取决于所提供的内容。例如,如果 MIME 类型是 image/png,则返回 String 是没有意义的。

这就是为什么在您链接到 java2s.com 的示例代码中,他们检查返回对象的类:

try {
URL u = new URL("http://www.java2s.com");
Object o = u.getContent();
System.out.println("I got a " + o.getClass().getName());
} catch (Exception ex) {
System.err.println(ex);
}

所以你可以说 String foo = (String) url.getContent(); 如果你知道你的 ContentHandler 将返回一个 String

sun.net.www.content 包中定义了默认的内容处理程序,但如您所见,它们正在为您返回流。

您可以创建自己的 ContentHandler,它会返回一个 String,但按照您的建议读取 Stream 可能会更容易。

关于java - 为什么我应该使用 url.openStream 而不是 url.getContent?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9795331/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com