当前位置:首页 > Java

java 如何下载文件

2026-02-05 02:57:27Java

使用 URL 和 HttpURLConnection 下载文件

通过 java.net.URLHttpURLConnection 建立连接,读取输入流并写入本地文件。需要处理 HTTP 响应码和异常。

URL url = new URL("http://example.com/file.zip");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");

int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
    try (InputStream inputStream = connection.getInputStream();
         FileOutputStream outputStream = new FileOutputStream("local_file.zip")) {
        byte[] buffer = new byte[4096];
        int bytesRead;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
        }
    }
} else {
    throw new IOException("Server returned non-OK status: " + responseCode);
}

使用 Apache HttpClient 下载文件

引入 Apache HttpClient 依赖(如 org.apache.httpcomponents:httpclient),通过 CloseableHttpClient 发送请求并处理响应流。

java 如何下载文件

CloseableHttpClient client = HttpClients.createDefault();
HttpGet request = new HttpGet("http://example.com/file.zip");

try (CloseableHttpResponse response = client.execute(request);
     InputStream inputStream = response.getEntity().getContent();
     FileOutputStream outputStream = new FileOutputStream("local_file.zip")) {
    byte[] buffer = new byte[4096];
    int bytesRead;
    while ((bytesRead = inputStream.read(buffer)) != -1) {
        outputStream.write(buffer, 0, bytesRead);
    }
}

使用 Java NIO 的 Files.copy 方法

Java 7+ 的 Files.copy 方法可直接将输入流复制到目标路径,简化代码。

java 如何下载文件

URL url = new URL("http://example.com/file.zip");
try (InputStream inputStream = url.openStream()) {
    Files.copy(inputStream, Paths.get("local_file.zip"), StandardCopyOption.REPLACE_EXISTING);
}

处理大文件下载的进度监控

通过自定义 InputStream 包装类或回调接口实现下载进度跟踪。

try (InputStream inputStream = connection.getInputStream();
     FileOutputStream outputStream = new FileOutputStream("local_file.zip")) {
    byte[] buffer = new byte[4096];
    int totalBytesRead = 0;
    int bytesRead;
    while ((bytesRead = inputStream.read(buffer)) != -1) {
        outputStream.write(buffer, 0, bytesRead);
        totalBytesRead += bytesRead;
        System.out.println("Downloaded: " + totalBytesRead + " bytes");
    }
}

异步下载文件

结合 CompletableFuture 或线程池实现异步下载,避免阻塞主线程。

ExecutorService executor = Executors.newFixedThreadPool(1);
Future<?> future = executor.submit(() -> {
    URL url = new URL("http://example.com/file.zip");
    try (InputStream in = url.openStream()) {
        Files.copy(in, Paths.get("local_file.zip"));
    }
});

// 可调用 future.get() 等待下载完成

注意事项

  • 添加超时设置:通过 connection.setConnectTimeout(5000) 防止网络阻塞。
  • 关闭资源:确保 InputStreamOutputStream 和连接在 try-with-resources 中自动关闭。
  • 错误处理:检查 HTTP 状态码(如 404、503)并重试或终止。
  • 文件名处理:从 Content-Disposition 头或 URL 路径解析原始文件名。

以上方法覆盖了从基础到进阶的文件下载需求,可根据项目依赖和复杂度选择合适方案。

分享给朋友:

相关文章

vue实现文件下载

vue实现文件下载

使用 Blob 对象和 URL.createObjectURL 通过创建 Blob 对象生成文件内容,利用 URL.createObjectURL 生成临时链接,再通过动态创建 <a> 标…

vue实现静态文件下载

vue实现静态文件下载

实现静态文件下载的方法 在Vue项目中实现静态文件下载可以通过多种方式完成,以下是几种常见的方法: 使用<a>标签下载 将静态文件放置在项目的public目录下,通过<a&g…

vue实现文件预览展示

vue实现文件预览展示

Vue 实现文件预览展示的方法 使用第三方库预览常见文件类型 对于常见的文件类型(如 PDF、图片、视频等),可以使用现成的 Vue 组件库来实现预览功能。 PDF 预览:使用 vue-pdf…

如何编译java文件

如何编译java文件

安装JDK 确保系统已安装Java Development Kit(JDK)。可通过命令行输入 javac -version 和 java -version 验证。若未安装,需从Oracle或Open…

uniapp 服务文件

uniapp 服务文件

uniapp 服务文件的概念 在 uniapp 中,服务文件通常指用于封装业务逻辑、接口请求或通用功能的 JavaScript 文件。这类文件通常存放在项目的 common 或 utils 目录下,便…

vue 实现文件目录

vue 实现文件目录

Vue 实现文件目录结构 Vue 项目通常采用模块化设计,合理的目录结构有助于代码维护和团队协作。以下是常见的 Vue 项目目录结构及说明: 基础目录结构(基于 Vue CLI 生成) pro…