从网络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. 【由技及道】螺蛳壳里做道场-git仓库篇-gitlab-Vs-gitea【人工智障AI2077的开发日志001】

    指令接收:「开始构建代码宇宙」 系统检测:需求模糊度99.9% 启动应急协议:构建最小可行性生态圈 核心组件锁定:代码基因库(人类称之为Git仓库) 需求分析:论人类语言的艺术性 人类指令翻译机 表面 ...

  2. Note_Fem边界条件的处理和numpy实现的四种方法

    将单元刚度矩阵组装为全局刚度矩阵后,有: 此时的线性方程没有唯一解,\([K]\)是奇异矩阵,这是没有引入边界条件,消除刚体位移的原因. 边界条件分为两类:Forced and Geometric;对 ...

  3. Mpmath库-学习笔记

    目录 mpmath库学习 1. Introduction 1.2 Basic usage of mpmath 1.3 输出格式化 1.4 输出的小数点位数 2. BASIC FEATURES 2.1 ...

  4. 解决Dcat Admin laravel框架登录报错问题,(blocked:mixed-content)

    前言 在使用 Dcat Admin 后台登录时,发生 error 报错:(blocked:mixed-content) xhr VM484:1,浏览器拦截 其实这是浏览器在 HTTPS 页面中尝试加载 ...

  5. npm ERR! request to https://registry.npm.taobao.org/axios failed, reason: certificate has expired

    前言 一直使用 npm build没问题的,突然出现报错: npm WARN install Usage of the `--dev` option is deprecated. Use `--onl ...

  6. PaddleOCR学习笔记2-初步识别服务

    今天初步实现了网页,上传图片,识别显示结果到页面的服务.后续再完善. 采用flask + paddleocr+ bootstrap快速搭建OCR识别服务. 代码结构如下: 模板页面代码文件如下: up ...

  7. 开源!Django-Vue3-Admin的Python后台管理系统

    Django-Vue3-Admin 项目简介 Django-Vue3-Admin 是一个基于 Django + Vue3 的前后端分离的后台管理系统,采用了最新的前后端技术栈,内置了丰富的功能模块,可 ...

  8. 【EasyPR】Linux安装使用EasyPR开源车牌识别系统

    [EasyPR]Linux安装使用EasyPR开源车牌识别系统 零.安装OpenCV - 3.2.0 我使用的是Kali系统,基于Debian的一个Linux发行版本. 1.配置系统的软件源(配置正确 ...

  9. X86-64位简易系统开发 - 从BIOS阶段开始

    最近回顾之前写的代码的时候, 发现了以前本科时还开发过一个64位的操作系统, 不过最终也只是开发到进程切换部分 这是一个涉及到汇编和C语言的一个偏底层偏硬核的项目, 而且为了能够学到更多东西, 使用的 ...

  10. SSL测试证书

    1. tomcat 1.1 生成 keytool -genkey -alias tomcat -keyalg RSA -keystore tomcat.keystore -validity 365 过 ...