我想获取远程连接上文件的文件大小,而无需实际下载(大)文件。我正在使用文件的“Content-Length” header 。相关代码为:
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秒!诚然,这是连接到运行网络服务器的辅助本地设备,但 WiFi 信号很强,速度相对较快,而且我在笔记本电脑上使用“curl”时从未遇到过任何此类问题。我也无法控制我正在连接的网络服务器。
当相继对不同的文件进行多个相似的连接时,该问题可能会加剧,但不确定。然而,这是创建全新的HttpURLConnection
,而不是重用旧的。重用连接有帮助吗?
我从未真正下载过文件或访问输入流。
我可以不调用断开连接,但我知道不建议这样做,因为资源不会被释放。这不正确吗?我注意到 URLConnection
没有断开连接。只是建议关闭您打开的所有流。
此代码位于异步任务中。我想我可以尝试将断开连接调用本身移至另一个异步任务,因为之后我不执行任何操作。不确定这是否可能。
你有什么建议吗?我是否应该尝试 HttpURLConnection
以外的其他方法来获取文件大小而不下载文件?
最佳答案
感谢评论中的 EJP。将请求方法更改为“HEAD”使断开连接几乎是瞬时的:
conn.setRequestMethod("HEAD");
据我所知,如果尚未读取,HttpURLConnection.disconnect()
将跳过整个响应对象。因此,对于非常大的文件,需要很长时间。使用请求方法“HEAD”强制响应正文为空并解决问题。
关于java - HttpURLConnection 断开连接缓慢 - Java/Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25423546/