Java 实例 – 获取远程文件大小(建议收藏)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

在互联网应用开发中,获取远程文件的大小是一个基础但关键的需求。无论是下载大文件前的预检、文件传输前的资源规划,还是安全审计中的文件状态检查,掌握这一技能都能提升开发效率。本文将通过 Java 实例 – 获取远程文件大小 的实战案例,从基础概念到代码实现,逐步拆解这一过程,帮助读者理解底层原理并掌握实用技巧。


一、基础概念解析

1.1 HTTP 协议与 HEAD 请求

HTTP 协议是互联网通信的核心协议之一,它定义了客户端(如浏览器或 Java 程序)与服务器之间的交互规则。获取远程文件大小的核心方法是 发送 HEAD 请求,而非传统的 GET 请求。

  • GET 请求:会下载整个文件内容,适合直接获取资源。
  • HEAD 请求:仅获取服务器的响应头信息,不传输文件主体,因此效率更高。

比喻
可以把 HEAD 请求想象为快递员上门前先打电话确认包裹信息(重量、体积),而 GET 请求则相当于直接取走包裹。

1.2 响应头 Content-Length 的作用

服务器通过响应头中的 Content-Length 字段返回文件大小(以字节为单位)。例如:

HTTP/1.1 200 OK  
Content-Type: application/octet-stream  
Content-Length: 123456  

此时,文件大小即为 123456 字节


二、实现步骤与代码示例

2.1 步骤一:发送 HTTP HEAD 请求

Java 中可通过 HttpURLConnection 或第三方库(如 Apache HttpClient)发送请求。以下以 HttpURLConnection 为例:

URL url = new URL("https://example.com/file.zip");  
HttpURLConnection connection = (HttpURLConnection) url.openConnection();  
connection.setRequestMethod("HEAD"); // 设置为 HEAD 方法  

2.2 步骤二:读取响应头信息

获取 Content-Length 值并转换为整型:

long fileSize = -1;  
if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {  
    String contentLength = connection.getHeaderField("Content-Length");  
    if (contentLength != null) {  
        fileSize = Long.parseLong(contentLength);  
    }  
}  
connection.disconnect();  

2.3 完整代码示例

public class RemoteFileSizeFetcher {  
    public static void main(String[] args) {  
        String urlString = "https://example.com/file.zip";  
        try {  
            long size = getFileSize(urlString);  
            System.out.println("远程文件大小:" + size + " 字节");  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  

    public static long getFileSize(String urlString) throws Exception {  
        URL url = new URL(urlString);  
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();  
        connection.setRequestMethod("HEAD");  
        connection.setConnectTimeout(5000); // 设置超时时间(毫秒)  
        connection.setReadTimeout(5000);  

        int responseCode = connection.getResponseCode();  
        if (responseCode == HttpURLConnection.HTTP_OK) {  
            String contentLength = connection.getHeaderField("Content-Length");  
            if (contentLength != null) {  
                return Long.parseLong(contentLength);  
            }  
        } else {  
            throw new RuntimeException("请求失败,状态码:" + responseCode);  
        }  
        return -1; // 未找到 Content-Length  
    }  
}  

三、进阶技巧与优化

3.1 使用 Apache HttpClient 库

对于复杂场景,推荐使用 Apache HttpClient 库,其代码更简洁且支持更多高级配置:

import org.apache.http.client.methods.HttpHead;  
import org.apache.http.impl.client.CloseableHttpClient;  
import org.apache.http.impl.client.HttpClients;  

public class HttpClientExample {  
    public static void main(String[] args) {  
        try (CloseableHttpClient client = HttpClients.createDefault()) {  
            HttpHead request = new HttpHead("https://example.com/file.zip");  
            CloseableHttpResponse response = client.execute(request);  
            long size = response.getFirstHeader("Content-Length") != null  
                    ? Long.parseLong(response.getFirstHeader("Content-Length").getValue())  
                    : -1;  
            System.out.println("文件大小:" + size + " 字节");  
            response.close();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
}  

3.2 处理 HTTPS 和 SSL 问题

若目标文件为 HTTPS 地址,需配置 SSL 上下文以避免证书验证错误:

SSLContext sslContext = SSLContexts.custom()  
        .loadTrustMaterial(null, (chain, authType) -> true) // 忽略证书验证(仅测试用)  
        .build();  
HttpClientContext context = HttpClientContext.create();  
context.setSSLContext(sslContext);  

四、常见问题与解决方案

4.1 问题 1:未获取到 Content-Length

某些服务器可能不返回 Content-Length(如动态生成文件或使用分块传输)。此时可尝试:

  • 发送 GET 请求获取部分数据并计算长度(效率较低);
  • 返回默认值或抛出异常。

4.2 问题 2:响应码非 200

  • 404 Not Found:文件不存在或路径错误;
  • 403 Forbidden:权限不足;
  • 500 Internal Server Error:服务器内部问题。

4.3 问题 3:超时异常

通过设置超时参数避免程序长时间阻塞:

connection.setConnectTimeout(3000); // 连接超时  
connection.setReadTimeout(5000); // 读取超时  

五、总结与扩展

通过本文的 Java 实例 – 获取远程文件大小,读者可以掌握以下核心能力:

  1. 使用 HTTP HEAD 请求高效获取文件元数据;
  2. 处理异常场景和服务器配置差异;
  3. 灵活选择 HttpURLConnection 或 Apache HttpClient 库。

扩展方向

  • 结合多线程实现批量文件大小检测;
  • 将结果可视化为图表,用于监控系统;
  • 集成到 Spring Boot 工程,作为 REST API 的基础功能。

掌握这一技能后,开发者可以快速应对文件预检、存储空间规划等实际需求,为更复杂的网络应用开发打下坚实基础。

最新发布