我使用java.net.URL.openStream()
方法从服务器检索内容。我最近遇到了一个问题,其中HTTP响应代码指示错误,但不是抛出异常,无论如何仍然读取了流。这导致错误出现在执行的后期,并证明是一个红鲱鱼。据我所知,当您使用此方法打开流时,无法检查HTTP响应代码。
我能找到正确处理此问题的唯一方法是在打开流之前获取连接:
HttpURLConnection conn=(HttpURLConnection) url.openConnection()
#Code updated with scotth's suggestion
if(!String.valueOf(conn.getResponseCode()).startsWith('2'))
throw new IOException("Incorrect response code "+conn.getResponseCode()+" Message: " +getResponseMessage());
rawIn=conn.getInputStream()
InputStream in=conn.getInputStream()
所以你同意吗?安全使用openStream是否有任何好的情况,或者不鼓励使用它。值得注意的是,Sun在tutorial code for reading directly from a URL中使用了该方法。然后,代码抛出异常,因此它不是良好编码实践的堡垒。
答案 0 :(得分:5)
openStream()
可以正常工作,如果你希望你的类不受url类型变化的影响 - 例如,在绝对文件路径(file:///),jar包含的资源之间进行更改甚至使用自定义协议处理程序(scotth://foo.bar)也可能是其他协议。
然而,正如你发现它的抽象性非常高,所以如果你想知道关于与资源交互性质的任何细节,你需要openConnection()
并按照你认为合适的方式进行投射
Re:其他状态代码 - 你可能想看一眼RFC2616 - 如果你关心的只是“成功”,你可以检查String.valueOf(conn.getResponseCode()).startsWith('2')
。