我想检索一个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.

我认为应该可以很好地工作。
Buuut显然,此代码不起作用,因为它会引发错误:
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 Object类。

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

这就是为什么在您链接至java2s.com的示例代码中它们检查返回的Object的类的原因:

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可能会更容易。

10-04 20:17