我想在远程连接上获取文件的文件大小而不实际下载(大)文件 . 我正在使用文件的“Content-Length” Headers . 相关代码是:
URL obj = new URL(FILES_URL + fileName);
String contentLength = "";
HttpURLConnection conn = null;
try {
conn = (HttpURLConnection) obj.openConnection();
conn.setConnectTimeout(3000);
conn.setReadTimeout(3000);
contentLength = conn.getHeaderField("Content-Length");
int responseCode = conn.getResponseCode();
Log.d(TAG, "responseCode: " + responseCode);
} finally {
Log.d(TAG, "pre-disconnect");
if (conn!=null) conn.disconnect();
Log.d(TAG, "post-disconnect");
}
return contentLength;
命令“conn.disconnect();”有时似乎需要永远 . 我看过23秒!不可否认,这是连接到运行Web服务器的辅助本地设备,但是WiFi信号很强,相对较快,而且我从来没有遇到任何使用笔记本电脑“卷曲”的问题 . 我无法控制我连接的Web服务器 .
当一个接一个地对不同文件进行多个类似的连接时,问题可能会得到增强,但不确定 . 然而,这是创造全新的 HttpURLConnection
而不是重用旧的 . 可以重用连接帮助吗?
我从未真正下载文件或访问输入流 .
我可以不调用disconnect,但我知道不推荐它,因为资源不会被释放 . 这不正确吗?我注意到 URLConnection
没有断开连接 . 建议关闭您打开的任何流 .
这段代码在asynctask中 . 我想我可以尝试将断开调用本身移动到另一个asynctask,因为之后我什么都不做 . 不确定是否可能 .
你有什么建议吗?我应该尝试除_1779324之外的其他内容来获取文件大小而不下载文件吗?
2 回答
感谢EJP的评论 . 将请求方法更改为“HEAD”几乎可以立即断开连接:
根据我的阅读,
HttpURLConnection.disconnect()
将跳过整个响应对象(如果尚未读取) . 因此,对于非常大的文件,需要很长时间 . 使用请求方法"HEAD"强制响应正文为空并解决问题 .我建议您使用Volley或Okhttp来加快网络速度,但这取决于您的要求 . 通过Comparison Of Volley And OkHttp and Retrofit并决定使用哪个库 .
如果您将此代码放在AsyncTask中,请阅读Dark Side of AsyncTask .