从网络URL下载文件到指定目录,自适应文件类型,并且重命名下载后的文件名。这里使用XtremePapers如下URL的网络资源作为测试文件:

https://papers.xtremepape.rs/ACCA/Diploma-in-Financial-Management/Module-A/Paper-DA1/2002-Dec/da1_2002_dec_a.pdf

此测试文件在浏览器预览效果如下:

方法downloadHttpResource 使用第三方jar包 org.apache.commons.io.FileUtils 简捷地下载网络文件到指定目录,看到这个方法却似醍醐灌顶,心底的快感像是大汗淋漓的三伏天喝了杯冰镇扎啤一般,猛然间传遍全身。方法downloadNetResource使用传统方法处理,UrlConnection下载网页通过InputStream读取数据,通过FileOutPutStream将数据写入目标文件。代码如下:

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection; /**
* 文件工具类
*
* @author Wiener
* @date 2020/10/22
*/
public class FileTools {
private static Logger logger = LoggerFactory.getLogger(FileTools.class); /**
* 使用第三方jar包 org.apache.commons.io.FileUtils 简捷地下载网络文件
*
* @param urlStr 资源URL
* @param dir 存储目录
* @param fileName 存储文件名
* @return
*/
public static void downloadHttpResource(String urlStr, String fileName, String dir) {
try {
URL httpUrl = new URL(urlStr);
fileName = getFileName(httpUrl, fileName);
File dirFile = new File(dir);
if (!dirFile.exists()) {
dirFile.mkdirs();
}
FileUtils.copyURLToFile(httpUrl, new File(dir + File.separator + fileName));
} catch (Exception e) {
e.printStackTrace();
}
} /**
* 下载网络文件,常规写法,不多说,直接上代码
*
* @param urlStr 资源URL
* @param dir 保存目录
* @param fileName 保存后的文件名,不包括后缀
* @return void
*/
public static void downloadNetResource(String urlStr, String fileName, String dir) {
// 下载网络文件
int byteSum = 0;
int byteRead = 0;
InputStream inStream = null;
FileOutputStream fos = null;
try {
URL url = new URL(urlStr);
URLConnection conn = url.openConnection();
fileName = getFileName(url, fileName);
// 设置超时间为3秒
conn.setConnectTimeout(3 * 1000);
//模拟浏览器访问,防止屏蔽程序抓取而返回403错误
conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36");
// 拿到输入流就相当于拿到了文件
inStream = conn.getInputStream();
// 文件保存位置
File saveDir = new File(dir);
if (!saveDir.exists()) {
saveDir.mkdir();
}
File file = new File(saveDir + File.separator + fileName);
fos = new FileOutputStream(file);
byte[] buffer = new byte[1204];
while ((byteRead = inStream.read(buffer)) != -1) {
byteSum += byteRead;
fos.write(buffer, 0, byteRead);
}
logger.info("文件 {} 的大小为 {}", fileName, byteSum);
} catch (Exception e) {
logger.error("下载网络资源 {} 失败,请及时处理,", fileName, e);
} finally {
IOUtils.closeQuietly(inStream, null);
IOUtils.closeQuietly(fos, null);
}
} private static String getFileName(URL url, String fileName) {
if (StringUtils.isBlank(fileName)) {
fileName = Long.toString(System.currentTimeMillis());
}
String urlFileName = url.getFile();
logger.info("网络资源原始名称:{}", urlFileName);
if (StringUtils.isNotEmpty(urlFileName)) {
String subfix = urlFileName.substring(urlFileName.lastIndexOf("."));
fileName = fileName + subfix;
}
return fileName;
} public static void main(String[] args) {
// 可以是其它类型的文件,此处以PDF文件为例
String urlStr = "https://papers.xtremepape.rs/ACCA/Diploma-in-Financial-Management/Module-A/Paper-DA1/2002-Dec/da1_2002_dec_a.pdf";
String fileName = "我是文件名";
String netFileName = "下载后的文件名";
String savePath = "F:/Download";
// downloadHttpUrl(urlStr, fileName, savePath);
downloadNetResource(urlStr, null, savePath);
}
}

执行如上main函数就可以验证我们的下载功能了。需要导入的主要Maven依赖如下:

        <dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.8.0</version>
</dependency>

大家对于下载文件有更好的实现策略吗?欢迎在文章下方留言讨论!

Java 下载网络资源的更多相关文章

  1. java网络编程--5 URL 下载网络资源

    java网络编程--5 URL 下载网络资源 1.8.URL 统一资源定位符,定位互联网的某一个资源 DNS域名解析 www.baidu.com -->xxx.xxx.xxx.xxx // 协议 ...

  2. 重新想象 Windows 8.1 Store Apps (91) - 后台任务的新特性: 下载和上传的新特性, 程序启动前预下载网络资源, 后台任务的其它新特性

    [源码下载] 重新想象 Windows 8.1 Store Apps (91) - 后台任务的新特性: 下载和上传的新特性, 程序启动前预下载网络资源, 后台任务的其它新特性 作者:webabcd 介 ...

  3. java下载安装,环境变量,hello world

    1.Java下载安装 网址:http://java.sun.com/javase/downloads/index.jsp win7 64位选择jdk-8u11-windows-x64.exe. 2.环 ...

  4. Android开发之异步获取并下载网络资源-下载图片和下载文本内容

    在android网络开发过程中,经常需要获取网络资源,比如下载图片,下载文本文件内容等,这个时候就需要http请求来获取相应的网络资源.首先看看实例效果图:              下载图片截图   ...

  5. java下载远程文件到本地

    java下载远程文件到本地(转载:http://www.cnblogs.com/qqzy168/archive/2013/02/28/2936698.html)   /**       * 下载远程文 ...

  6. Windows系统java下载与安装

    Windows系统java下载与安装 一.前言 作者:深圳-风尘 联系方式:QQ群[585499566] 博客:https://www.cnblogs.com/1fengchen1/ 能读懂本文档人: ...

  7. Java下载https文件上传到阿里云oss服务器

    Java下载https文件上传到阿里云oss服务器 今天做了一个从Https链接中下载音频并且上传到OSS服务器,记录一下希望大家也少走弯路. 一共两个类: 1 .实现自己的证书信任管理器类 /** ...

  8. 【文件下载】Java下载文件的几种方式

    [文件下载]Java下载文件的几种方式  摘自:https://www.cnblogs.com/sunny3096/p/8204291.html 1.以流的方式下载. public HttpServl ...

  9. Java入门:Java下载与安装方法

    本文适合刚入门的Java编程的初学者阅读. JDK有两种下载方法,一个是官网下载,另一个是第三方网站下载.官网速度也许有点慢,慢的话可以考虑去第三方网站下载. 一.官网下载 1. 访问地址:http: ...

  10. Java使用指南(1)—— Java下载和安装

    Java下载 1.在Oracle的官网中找到相应的

随机推荐

  1. JVM运行参数

    一.三种参数类型 1.标准参数:比较稳定,以后版本会保留 -help -version 2.-X参数(非标准参数) -Xint -Xcomp 3.-XX参数(非标准参数,使用率较高) -XX:newS ...

  2. Java多线程运行探幽

    事关Training2中Task4,想看看经典的两个进程并行会是什么样子 题目概述 实现简单的生产者-消费者模型: Tray托盘容量为1:托盘满时不能放入,空时不能取货 Producer生产者共需生产 ...

  3. 【vscode】vscode配置Java

    [vscode]vscode配置Java 前言 ‍ 配环境,需要记录,避免反复踩坑. ‍ 步骤 ‍ step1:官网走 ‍ 配环境为什么不直接上官网教程,Visual Studio Code - Co ...

  4. dcgm-exporter:Collect Switch Metrics和Collect Link Metrics

    在 DCGM(Data Center GPU Manager)中,"Collect Switch Metrics" 和 "Collect Link Metrics&quo ...

  5. 使用自制离线数据跑通ElasticFusion

    使用自制离线数据跑通ElasticFusion 实验环境及设备 实验环境: Ubuntu22.04 RTX3060 实验设备: 小米13(Android) Realsense D455 一句话总结就是 ...

  6. 英语面试-Behavioral Question - second part

    前言 希望我总结的行为面试问题和答案能够给大家帮助. 学习方法:每个问题都有三部分组成. 第一部分是语料积累,这里是根据视频中的内容总结而来: 第二部分是中文描述,这里主要根据我自己的经历结合问题做出 ...

  7. ingress配置https报错certificate.lua:259: call(): failed to set DER private key: d2i_PrivateKey_bio() failed, context: ssl_certificate_by_lua*

    困扰我2天的报错问题:certificate.lua:259: call(): failed to set DER private key: d2i_PrivateKey_bio() failed, ...

  8. static修饰成员变量的特点及static修饰成员变量内存图解-java se进阶 day01

    1.static介绍 static是静态的意思,它可以用于修饰成员变量和成员方法 2.static的特点 1.被static修饰了的成员变量,可以被类中的所有对象所共享 虽然stu02没有给schoo ...

  9. IIS7配置301永久重定向

    我把我的小域名www.taadis.com301永久重定向到taadis.com. 关键图解:

  10. Greenplum数据库时间操作汇总

    Greenplum数据库时间操作与mysql有一些区别,汇总以往笔记记录下来. greenplum时间格式:'yyyy-mm-dd hh24:mi:ss.us'.'yyyy-mm-dd hh:mi:s ...