当前位置:   article > 正文

Java根据URL下载文件到本地的两种方式,大型文件与小型文件,避免内存溢出OOM_java通过url下载文件

java通过url下载文件

目录

1.小型文件推荐使用

2.大型文件推荐使用


各位小伙伴是否有使用java,根据url下载文件到本地的需求,以下介绍两种方式

1.小型文件推荐使用

代码解析

  1. 首先创建了一个URL对象website,用来表示远程文件的地址。

  2. 然后创建了一个ReadableByteChannel对象rbc和一个FileOutputStream对象fos。ReadableByteChannel用于读取远程文件的字节流,FileOutputStream用于将读取的内容写入本地文件。

  3. 在try块中,通过URL对象打开一个连接并获取其字节流,然后使用transferFrom方法将远程文件的内容直接传输到本地文件。这是NIO的一种高效的文件传输方式。

  4. 如果在上述过程中发生异常,将会捕获并打印异常信息。

  5. 无论是否发生异常,最后都会执行finally块中的清理工作,关闭文件输出流和远程字节流通道,以释放资源。

  1. public static void downloadFile(String remoteFilePath, String localFilePath) {
  2. URL website = null;
  3. ReadableByteChannel rbc = null;
  4. FileOutputStream fos = null;
  5. try {
  6. website = new URL(remoteFilePath);
  7. rbc = Channels.newChannel(website.openStream());
  8. fos = new FileOutputStream(localFilePath);//本地要存储的文件地址 例如:test.txt
  9. fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
  10. } catch (Exception e) {
  11. e.printStackTrace();
  12. }finally{
  13. if(fos!=null){
  14. try {
  15. fos.close();
  16. } catch (IOException e) {
  17. e.printStackTrace();
  18. }
  19. }
  20. if(rbc!=null){
  21. try {
  22. rbc.close();
  23. } catch (IOException e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. }
  28. }

2.大型文件推荐使用

代码解析:

  1. 首先创建了一个URL对象url,用来表示要下载文件的地址。

  2. 使用URL对象打开一个连接,并将其强制转换为HttpURLConnection对象。HttpURLConnection是Java提供的用于发送HTTP请求和接收HTTP响应的类。

  3. 通过连接获取输入流 inputStream,使用BufferedInputStream对输入流进行缓存。这是为了避免一次性读取大文件造成内存溢出。

  4. 创建一个File对象 file,表示要保存的本地文件。如果该文件已存在,则删除之。

  5. 创建一个输出流 outputStream,将文件作为输出目标。

  6. 创建一个字节数组 buffer,大小为5MB(1024 * 1024 * 5),用于缓存每次从输入流中读取的数据。

  7. 使用 while 循环,不断从输入流中读取数据到缓冲区,然后将缓冲区的内容写入输出流。循环会一直进行,直到输入流的末尾。

  8. 关闭连接 connection,并在 finally 块中关闭输入流和输出流。使用 IOUtils.closeQuietly 方法可以安全地关闭流,即使发生异常也不会抛出异常。

总的来说,这段代码实现了从指定URL下载文件到本地的功能,并且通过缓存流和分块读取的方式,避免了一次性读取大文件导致的内存溢出问题。同时,在下载完成或出现异常后,也进行了资源的关闭和释放操作。

  1. public static void downloadFile1(String downloadUrl, String path){
  2. InputStream inputStream = null;
  3. OutputStream outputStream = null;
  4. try {
  5. URL url = new URL(downloadUrl);
  6. //这里没有使用 封装后的ResponseEntity 就是也是因为这里不适合一次性的拿到结果,放不下content,会造成内存溢出
  7. HttpURLConnection connection =(HttpURLConnection) url.openConnection();
  8. //使用bufferedInputStream 缓存流的方式来获取下载文件,不然大文件会出现内存溢出的情况
  9. inputStream = new BufferedInputStream(connection.getInputStream());
  10. File file = new File(path);
  11. if (file.exists()) {
  12. file.delete();
  13. }
  14. outputStream = new FileOutputStream(file);
  15. //这里也很关键每次读取的大小为5M 不一次性读取完
  16. byte[] buffer = new byte[1024 * 1024 * 5];// 5MB
  17. int len = 0;
  18. while ((len = inputStream.read(buffer)) != -1) {
  19. outputStream.write(buffer, 0, len);
  20. }
  21. connection.disconnect();
  22. }catch (Exception e){
  23. e.printStackTrace();
  24. }finally {
  25. IOUtils.closeQuietly(outputStream);
  26. IOUtils.closeQuietly(inputStream);
  27. }
  28. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/55419
推荐阅读
相关标签
  

闽ICP备14008679号