21xrx.com
2025-03-29 04:53:27 Saturday
文章检索 我的文章 写文章
Java实现文件下载的两种方式:URLConnection和HttpClient
2023-06-15 17:36:21 深夜i     15     0
Java 文件下载 URLConnection HttpClient 网络编程

在Java中,我们经常需要从网络上下载文件。本文将介绍两种常见的文件下载方式:使用Java内置的URLConnection类和使用第三方库HttpClient。下面分别说明它们的实现方法。

1.使用URLConnection类下载文件

代码如下:

public static void downloadFile(String fileURL, String saveDir) throws IOException {
  URL url = new URL(fileURL);
  HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
  int responseCode = httpConn.getResponseCode();
  // 判断HTTP响应是否正常
  if (responseCode == HttpURLConnection.HTTP_OK) {
    String fileName = "";
    String disposition = httpConn.getHeaderField("Content-Disposition");
    String contentType = httpConn.getContentType();
    int contentLength = httpConn.getContentLength();
    if (disposition != null) {
      // 从Content-Disposition头部获取文件名
      int index = disposition.indexOf("filename=");
      if (index > 0) {
        fileName = disposition.substring(index + 10, disposition.length() - 1);
      }
    } else {
      // 从URL中获取文件名
      fileName = fileURL.substring(fileURL.lastIndexOf("/") + 1, fileURL.length());
    }
    // 输出文件信息
    System.out.println("文件类型:" + contentType);
    System.out.println("文件大小:" + contentLength + " bytes");
    System.out.println("文件名:" + fileName);
    // 读取网络数据,并将其保存到本地文件中
    InputStream inputStream = httpConn.getInputStream();
    String saveFilePath = saveDir + File.separator + fileName;
    FileOutputStream outputStream = new FileOutputStream(saveFilePath);
    int bytesRead = -1;
    byte[] buffer = new byte[4096];
    while ((bytesRead = inputStream.read(buffer)) != -1) {
      outputStream.write(buffer, 0, bytesRead);
    }
    outputStream.close();
    inputStream.close();
    System.out.println(fileName + " 下载完成。");
  } else {
    System.out.println("下载失败,HTTP响应码:" + responseCode);
  }
}

这段代码中,我们使用`HttpURLConnection`类来打开HTTP连接并读取HTTP响应数据。它提供响应的头信息、响应的内容类型和长度等元数据。我们通过获取Content-Disposition头部信息来获取文件名,如果不成功,则从URL中获取文件名。最后,我们使用`inputStream.read()`读取网络数据,并将其保存到本地文件中。

2.使用HttpClient下载文件

代码如下:

public static void downloadFile(String fileURL, String saveDir) throws IOException {
  CloseableHttpClient httpClient = HttpClients.createDefault();
  HttpGet httpGet = new HttpGet(fileURL);
  CloseableHttpResponse httpResponse = httpClient.execute(httpGet);
  int responseCode = httpResponse.getStatusLine().getStatusCode();
  // 判断HTTP响应是否正常
  if (responseCode == HttpStatus.SC_OK) {
    String fileName = "";
    Header dispositionHeader = httpResponse.getFirstHeader("Content-Disposition");
    Header contentTypeHeader = httpResponse.getFirstHeader("Content-Type");
    if (dispositionHeader != null) {
      // 从Content-Disposition头部获取文件名
      String disposition = dispositionHeader.getValue();
      int index = disposition.indexOf("filename=");
      if (index > 0) {
        fileName = disposition.substring(index + 10, disposition.length() - 1);
      }
    } else {
      // 从URL中获取文件名
      fileName = fileURL.substring(fileURL.lastIndexOf("/") + 1, fileURL.length());
    }
    // 输出文件信息
    System.out.println("文件类型:" + contentTypeHeader.getValue());
    System.out.println("文件名:" + fileName);
    // 读取网络数据,并将其保存到本地文件中
    InputStream inputStream = httpResponse.getEntity().getContent();
    String saveFilePath = saveDir + File.separator + fileName;
    FileOutputStream outputStream = new FileOutputStream(saveFilePath);
    int bytesRead = -1;
    byte[] buffer = new byte[4096];
    while ((bytesRead = inputStream.read(buffer)) != -1) {
      outputStream.write(buffer, 0, bytesRead);
    }
    outputStream.close();
    inputStream.close();
    httpResponse.close();
    httpClient.close();
    System.out.println(fileName + " 下载完成。");
  } else {
    System.out.println("下载失败,HTTP响应码:" + responseCode);
  }
}

这段代码中,我们使用`HttpClient`库来创建一个HTTP客户端。与URLConnection不同,我们使用`HttpGet`类来构造HTTP请求。同样,我们使用响应的头信息来获取文件名。最后,我们使用`httpResponse.getEntity().getContent()`读取网络数据,并将其保存到本地文件中。

总结

本文介绍了Java实现文件下载的两种方式:使用URLConnection类和使用HttpClient库。两者实现上的差别不大,HttpClient更容易使用,但需要额外导入第三方库。选择哪种方式取决于你的具体需要。

  
  

评论区

请求出错了