21xrx.com
2024-11-22 09:34:25 Friday
登录
文章检索 我的文章 写文章
Java实现文件下载:案例与技巧
2023-06-15 10:41:57 深夜i     --     --
Java 文件下载 HttpURLConnection

在现代网络应用开发中,文件下载功能既常见又必需。如何通过Java编写一段优秀且高效地文件下载代码?本文将给出一些技巧和代码案例,助你更好地实现文件下载功能。

##### 1. 使用HttpURLConnection进行下载

相较于之前的网络框架(如Apache的HttpClient),Java的HttpURLConnection提供了更高效、更简单、更易于调试的网络接口,可以帮助你更好地实现文件的下载。

以下是一个通过HttpURLConnection实现文件下载的代码片段:


String fileUrl = "http://www.example.com/example.zip";

URL url = new URL(fileUrl);

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

conn.setConnectTimeout(5000); // 连接超时时间

conn.setRequestMethod("GET"); // 请求方式

conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");

int responseCode = conn.getResponseCode();

if (responseCode == 200) {

  InputStream inputStream = conn.getInputStream();

  FileOutputStream outputStream = new FileOutputStream("example.zip");

  byte[] buffer = new byte[1024];

  int len;

  while ((len = inputStream.read(buffer)) != -1) {

    outputStream.write(buffer, 0, len);

  }

  outputStream.close();

  inputStream.close();

}

##### 2. 断点续传(Range请求)

如果文件较大且下载过程中网络不稳定,建议使用断点续传技术来保证下载的可靠性。具体而言,在每次请求下载时,服务器将返回一个响应头,内容类似于:"Content-Range: bytes 0-9999/20000",告诉你这是从第0个字节到第9999个字节的文件片段,并总共有20000个字节。这个响应头告诉了你以下信息:已经下载的文件片段,以及总文件大小。

以下是一个支持断点续传的代码片段:


String fileUrl = "http://www.example.com/example.zip";

File file = new File("example.zip");

long startByte = file.length(); // 已经下载的字节数

URL url = new URL(fileUrl);

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

conn.setConnectTimeout(5000); // 连接超时时间

conn.setRequestMethod("GET"); // 请求方式

conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");

conn.setRequestProperty("Range", "bytes=" + startByte + "-"); // 断点请求头

int responseCode = conn.getResponseCode();

long fileSize = conn.getContentLength();

if (responseCode == 206 || responseCode == 200) {

  InputStream inputStream = conn.getInputStream();

  RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");

  randomAccessFile.seek(startByte); // 设置文件指针到开始位置

  byte[] buffer = new byte[1024];

  int len;

  while ((len = inputStream.read(buffer)) != -1) {

    randomAccessFile.write(buffer, 0, len);

    startByte += len;

    // 实时记录已经下载的字节数

  }

  randomAccessFile.close();

  inputStream.close();

}

##### 3. Apache的Commons IO 库

Apache Commons IO ist eine Bibliothek von Java-Klassen, die Funktionen fürs IO in einem Betriebssystem bereitstellt. Diese Bibliothek besitzt eine einfache API, leicht zu verstehen und bietet schnelle, robuste Funktionen für den Zugriff auf lokale Dateien, als auch Zugriff auf das Netzwerk. Commons IO spielt eine wichtige Rolle im Java-Ökosystem, insbesondere im Zusammenhang mit Dateien, Streams und IO-Operationen.

Apache的Commons IO库可以在文件IO处理方面提供帮助,可以使用以下代码片段进行文件下载:


String fileUrl = "http://www.example.com/example.zip";

File file = new File("example.zip");

long startByte = file.length();

URL url = new URL(fileUrl);

URLConnection connection = url.openConnection();

connection.setConnectTimeout(5000); // 连接超时时间

connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");

long fileSize = Long.parseLong(connection.getHeaderField("Content-Length"));

// 断点请求头

if (startByte > 0) {

  connection.setRequestProperty("Range", "bytes=" + startByte + "-");

  fileSize = Long.parseLong(connection.getHeaderField("Content-Length")) + startByte;

} else {

  FileUtils.touch(file);

}

InputStream inputStream = connection.getInputStream();

RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");

IOUtils.copyLarge(inputStream, randomAccessFile, startByte, fileSize - startByte);

randomAccessFile.close();

inputStream.close();

##### 写在最后

Java是一个非常优秀的语言,可以帮助你轻松地实现文件下载的相关功能。如果你想使用Java编写一个高效的、可靠的文件下载应用程序,可以使用我们分享的技巧和代码案例,让你的项目进一步发扬光大。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复