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

方法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 下载网络资源的更多相关文章
- java网络编程--5 URL 下载网络资源
java网络编程--5 URL 下载网络资源 1.8.URL 统一资源定位符,定位互联网的某一个资源 DNS域名解析 www.baidu.com -->xxx.xxx.xxx.xxx // 协议 ...
- 重新想象 Windows 8.1 Store Apps (91) - 后台任务的新特性: 下载和上传的新特性, 程序启动前预下载网络资源, 后台任务的其它新特性
[源码下载] 重新想象 Windows 8.1 Store Apps (91) - 后台任务的新特性: 下载和上传的新特性, 程序启动前预下载网络资源, 后台任务的其它新特性 作者:webabcd 介 ...
- java下载安装,环境变量,hello world
1.Java下载安装 网址:http://java.sun.com/javase/downloads/index.jsp win7 64位选择jdk-8u11-windows-x64.exe. 2.环 ...
- Android开发之异步获取并下载网络资源-下载图片和下载文本内容
在android网络开发过程中,经常需要获取网络资源,比如下载图片,下载文本文件内容等,这个时候就需要http请求来获取相应的网络资源.首先看看实例效果图: 下载图片截图 ...
- java下载远程文件到本地
java下载远程文件到本地(转载:http://www.cnblogs.com/qqzy168/archive/2013/02/28/2936698.html) /** * 下载远程文 ...
- Windows系统java下载与安装
Windows系统java下载与安装 一.前言 作者:深圳-风尘 联系方式:QQ群[585499566] 博客:https://www.cnblogs.com/1fengchen1/ 能读懂本文档人: ...
- Java下载https文件上传到阿里云oss服务器
Java下载https文件上传到阿里云oss服务器 今天做了一个从Https链接中下载音频并且上传到OSS服务器,记录一下希望大家也少走弯路. 一共两个类: 1 .实现自己的证书信任管理器类 /** ...
- 【文件下载】Java下载文件的几种方式
[文件下载]Java下载文件的几种方式 摘自:https://www.cnblogs.com/sunny3096/p/8204291.html 1.以流的方式下载. public HttpServl ...
- Java入门:Java下载与安装方法
本文适合刚入门的Java编程的初学者阅读. JDK有两种下载方法,一个是官网下载,另一个是第三方网站下载.官网速度也许有点慢,慢的话可以考虑去第三方网站下载. 一.官网下载 1. 访问地址:http: ...
- Java使用指南(1)—— Java下载和安装
Java下载 1.在Oracle的官网中找到相应的
随机推荐
- 李沐动手学深度学习V2-chapter_convolutional-modern
李沐动手学深度学习V2 文章内容说明 本文主要是自己学习过程中的随手笔记,需要自取 课程参考B站:https://space.bilibili.com/1567748478?spm_id_from=3 ...
- 【Matlab】输出变量内容到xls文件
版本: matlab 2017a 功能:将矩阵输出一个excel文件 代码: function [ statu ] = write2xls( x,filename,sheet) % 返回值: % 1 ...
- 百万架构师第四十八课:并发编程的原理(三)|JavaGuide
原文链接 JavaGuide 并发编程的原理 目标: Lock 的使用 AQS 原理分析 Condition CountDownLatch . Semaphore 线程池分析 J.U.C = java ...
- Java List和Array之间的转换
import java.util.Arrays; import java.util.List; class Test { //Object数组向List的转换 public static List&l ...
- 这是base-还原数字查正确码表再解码
题目: dict:{0: 'J', 1: 'K', 2: 'L', 3: 'M', 4: 'N', 5: 'O', 6: 'x', 7: 'y', 8: 'U', 9: 'V', 10: 'z', 1 ...
- Nginx配置跨域,覆盖后端服务跨域配置
本篇文章主要介绍了,如何通过Nginx配置跨域,并覆盖后端服务跨域配置. 先看下后端代码跨域配置: 主要的目标是:不修改后端跨域配置代码,来实现Nginx跨域指定域名. @Bean public Co ...
- 【C#】SuperSocket配置启动UDP服务器
SuperSocket配置UDP服务器 零.需求 两个设备局域网联机,需要用广播自动搜寻,而SuperSocket1.6的默认AppServer使用的是TCP,但只有UDP才支持广播. 一.解决 推荐 ...
- javascript 字符串截取
<script> //字符截取(需要的字符长度) function cut_str(need_str_length){ var bag_set = document.getElem ...
- leetcode每日一题:使所有字符相等的最小成本
题目 2712. 使所有字符相等的最小成本 给你一个下标从 0 开始.长度为 n 的二进制字符串 s ,你可以对其执行两种操作: 选中一个下标 i 并且反转从下标 0 到下标 i(包括下标 0 和下标 ...
- pg获取tree完整的数据
一个表: DRGCode DRGParend DRGName 这样一个tree表结构. 任意查询string,希望得到一个查询完整的tree.怎么做? SELECT * FROM "DRG& ...