当前位置:首页 > 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 发送请求并处理响应流。

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 方法可直接将输入流复制到目标路径,简化代码。

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 或线程池实现异步下载,避免阻塞主线程。

java 如何下载文件

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 路径解析原始文件名。

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

分享给朋友:

相关文章

css文件制作详细点

css文件制作详细点

CSS 文件制作指南 CSS(层叠样式表)用于控制网页的样式和布局。以下是详细的制作方法: 创建 CSS 文件 新建一个文本文件,将其保存为 .css 扩展名,例如 styles.css。确保文件名…

vue实现文件进度

vue实现文件进度

Vue 实现文件上传进度 使用 Vue 实现文件上传进度可以通过结合 axios 或原生 XMLHttpRequest 的进度事件来实现。以下是两种常见方法: 使用 axios 上传文件并显…

vue预览文件实现

vue预览文件实现

实现文件预览功能 在Vue中实现文件预览功能可以通过多种方式完成,具体取决于文件类型(图片、PDF、文档等)和需求。以下是几种常见实现方法: 图片文件预览 使用HTML5的FileReader AP…

vue实现文件拖拽下载

vue实现文件拖拽下载

Vue 实现文件拖拽下载 在 Vue 中实现文件拖拽下载功能,可以通过监听拖拽事件、处理文件数据并触发下载逻辑完成。以下是具体实现方法: 拖拽区域设置 创建一个可拖拽的区域,通常是一个 <di…

vue文件下载怎么实现

vue文件下载怎么实现

使用 <a> 标签下载文件 在 Vue 中可以通过动态生成 <a> 标签实现文件下载。创建一个隐藏的 <a> 标签,设置 href 为文件 URL 并添加 down…

react如何调用打开文件

react如何调用打开文件

使用 input 元素触发文件选择 在 React 中可以通过创建一个隐藏的 input 元素并设置其 type 为 file。当用户点击自定义按钮时,通过 ref 触发该 input 的点击事件。…