首页 > 编程语言 >Java根据URL下载文件到本地的2种方式(大型文件与小型文件)

Java根据URL下载文件到本地的2种方式(大型文件与小型文件)

时间:2024-05-25 14:55:23浏览次数:19  
标签:文件 Java 读取 URL 本地 new null

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

1.小型文件推荐使用

代码解析

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

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

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

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

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

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

2.大型文件推荐使用

代码解析:

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

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

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

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

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

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

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

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

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

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

总结 

到此这篇关于Java根据URL下载文件到本地的2种方式的文章就介绍到这了,更多相关Java根据URL下载文件到本地内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

原文 :https://www.jb51.net/program/314025d1j.htm  

标签:文件,Java,读取,URL,本地,new,null
From: https://www.cnblogs.com/personsiglewine/p/18212414

相关文章

  • Java 登录错误次数限制,用户禁登1小时
    手机号验证码登录,验证码输入错误次数超5次封禁@OverridepublicbooleancheckCaptcha(StringphoneNum,Stringcaptcha){StringcodeNum=(String)redisTemplate.opsForValue().get(UserCacheNames.USER_CAPTCHA+phoneNum);if(codeNum==......
  • JAVA计算机毕业设计基于SpringBoot的在线古玩市场系统的设计与实现(附源码+springboot+
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网的迅猛发展和电子商务的普及,传统行业纷纷寻求数字化转型以适应市场的新需求。古玩市场作为一个历史悠久、文化底蕴深厚的行业,在数字化浪潮......
  • 红黑树基于Java代码的剖析
    红黑树是一种自平衡的二叉查找树,通过添加颜色属性和旋转操作来保证树的平衡性,从而在最坏情况下仍能提供对数时间复杂度的插入、删除和查找操作。本文通过对一段红黑树的Java代码进行剖析,详细讲解其插入和删除操作是如何实现的,以及这些操作是如何利用红黑树的性质来维持平衡......
  • 如何恢复未保存或已删除/丢失的 Word 文件?
    关闭Word应用程序而不保存文档?误删除了Word文档?许​​多用户在不同情况下会丢失Word文档。如果您不幸遇到此类问题,如何恢复已删除或未保存的Word文档?有一些方法可以恢复未保存/删除的文档。此外,您还可以使用Word文件恢复软件来恢复已删除/丢失的Word文档。恢复未......
  • 如何从U盘恢复误删除的文件
    在许多情况下,用户可能会发现其U盘上的数据误删,并且无法访问或恢复它。在这篇文章中,我们将看到如何使用命令提示符尝试从U盘恢复损坏的文件和数据。我们还将列出一些免费的U盘恢复软件及其独特的功能,以便在前一种方法无法产生所需的结果时可以使用它们。使用CMD从U盘恢复误删......
  • 深入理解Java的垃圾回收机制(GC)实现原理
    深入理解Java的垃圾回收机制(GC)实现原理Java的垃圾回收机制(GarbageCollection,GC)是其内存管理的核心功能之一。通过GC,Java自动管理对象的生命周期,回收不再使用的对象所占的内存空间。本文将详细探讨GC的实现原理、不同算法的细节以及其在JVM中的应用。1.垃圾回收的基本......
  • web前端课程设计——重庆旅游7页 HTML+CSS+JavaScript
    ......
  • web前端网页课程设计大作业 html+css+javascript天津旅游(11页) dw静态旅游网页设计实
    ......
  • Java对象头你不知道的地方
    在Java中,每个对象都拥有一个对象头,这些对象头包含了关于对象的一些元数据信息。对象头(Header)包含2部分(若为数组,则包含3部分):一、第一部分为MarkWord,用于存储对象自身的运行时数据,如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。在32位虚拟......
  • JavaScript入门指南:从零开始你的编程之旅
        JavaScript是现代web开发不可或缺的一部分,作为一种强大且灵活的编程语言,它可以在浏览器中运行,为网页添加互动功能。无论你是完全的初学者,还是有其他编程语言的基础,本文将引导你从零开始学习JavaScript。我们将涵盖基础知识、关键概念和实践技巧,帮助你迅速上手并......