21xrx.com
2024-12-22 13:59:27 Sunday
登录
文章检索 我的文章 写文章
Java实现文件下载的两种方式:URLConnection和HttpClient
2023-06-15 17:36:21 深夜i     --     --
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更容易使用,但需要额外导入第三方库。选择哪种方式取决于你的具体需要。

  
  

评论区

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