Java URLConnection :如何找出Web文件的大小?

2022-09-01 10:08:56

我正在为学校做一个项目,我正在实现一个工具,该工具可用于从Web下载文件(带有限制选项)。问题是,我将有一个GUI,我将使用一个小部件,我想显示下载的当前进度。为此,我需要知道文件的大小。如何在下载文件之前获取文件的大小。JProgressBar


答案 1

任何 HTTP 响应都应该包含 Content-Length 标头,因此您可以在 URLConnection 对象中查询此值。

//once the connection has been opened
List values = urlConnection.getHeaderFields().get("content-Length")
if (values != null && !values.isEmpty()) {

    // getHeaderFields() returns a Map with key=(String) header 
    // name, value = List of String values for that header field. 
    // just use the first value here.
    String sLength = (String) values.get(0);

    if (sLength != null) {
       //parse the length into an integer...
       ...
    }

服务器可能并不总是能够返回准确的 Content-Length,因此该值可能不准确,但至少在大多数情况下,您将获得一些可用值。

更新:或者,现在我更完整地查看了URLConnection javadoc,你可以使用getContentLength()方法。


答案 2

如前所述,URLConnection的getContentLengthLong()是你最好的选择,但它并不总是给出一个确定的长度。这是因为HTTP协议(以及其他可以用a表示的协议)并不总是传达长度。URLConnection

在 HTTP 的情况下,动态内容的长度通常事先不知道 - 当标头通常被发送时。相反,另一个标头 ,指定使用“分块”编码。使用分块编码时,整个响应的长度是未指定的,并且响应将分段发送回去,其中指定了每个部分的大小。实际上,服务器缓冲 servlet 的输出。每当缓冲区填满时,就会发送另一个块。使用这种机制,HTTP实际上可以开始流式传输无限长度的响应。content-lengthtransfer-encoding

如果文件大于 2 Gb,则其大小不能表示为 ,因此较旧的方法 getContentLength() 在这种情况下将返回 -1。int


推荐