我想检索一个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可能会更容易。