java根据url下载文件,并且解决资源验证需要用户名密码问题
2021/10/12 1:15:24
本文主要是介绍java根据url下载文件,并且解决资源验证需要用户名密码问题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
今天接到一个任务,根据jar包清单,去maven仓库中下载jar包和pom文件,并且按照仓库里的目录结构保存。
本来用python
可以很好的解决这项任务,不过我还没有用过java下载文件,想着学习一下。
整体流程
- 读jar包清单文件,获取信息,拼接成url
- 添加用户名密码认证
- 根据ur获取到文件输入流
- 根据jar信息,创建目录,通过输出流把文件保存在指定目录。
代码部分
此处代码太多,可直接拉到下方看关键代码,是一样的
import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.*; import java.net.URL; import java.net.URLConnection; import java.util.Base64; import java.util.HashMap; import java.util.Map; import java.util.Objects; public class MavenDownload { private static final String EXCEL_PATH = "excel文件路径"; private static final String URL_HEAD = "http://nexus.****.com.cn/repository/maven-releases/"; private static final String DIRECTORY_HEAD = "保存jar的目录"; private static final String USERNAME_PASSWORD = "用户名" + ":" + "密码"; // 编码用户名和密码,拼接成认证信息 private static final String AUTHOR = "Basic " + Base64.getEncoder().encodeToString(USERNAME_PASSWORD.getBytes()); public static void main(String[] args) throws IOException { /*...拼接出下载连接*/ Map<String, String> urlMap = new HashMap<>(); urlMap.put("jar", jarUrl); urlMap.put("pom", pomurl); for (String key : urlMap.keySet()) { InputStream inputStream = existUrl(urlMap.get(key)); if (!Objects.isNull(inputStream)) { download(inputStream, path, fileName + "." + key); } else { System.out.println("资源不存在: " + urlMap.get(key)); } } } public static void download(String url, String directory, String fileName) throws IOException { File path = new File(DIRECTORY_HEAD + directory); if (!path.exists()) { path.mkdirs(); } File file = new File(DIRECTORY_HEAD + directory + fileName); URL url1 = new URL(url); InputStream inputStream = null; try ( FileOutputStream fileOutputStream = new FileOutputStream(file, false); ) { URLConnection urlConnection = url1.openConnection(); urlConnection.setRequestProperty("Authorization", AUTHOR); urlConnection.connect(); inputStream = urlConnection.getInputStream(); byte[] bytes = new byte[1024]; int count = 0; while ((count = inputStream.read(bytes)) != -1) { fileOutputStream.write(bytes, 0, count); } System.out.println("资源下载完成: " + directory + ":" + fileName); } catch (Exception e) { System.out.println("下载过程中出错: " + directory + ":" + fileName); } finally { if (!Objects.isNull(inputStream)) { inputStream.close(); } } } /** * inputStream:文件下载的输入流 * directory:文件的目录 * fileName:文件名称 */ public static void download(InputStream inputStream, String directory, String fileName) throws IOException { // 根据仓库目录结构创建文件夹 File path = new File(DIRECTORY_HEAD + directory); if (!path.exists()) { path.mkdirs(); } File file = new File(DIRECTORY_HEAD + directory + fileName); // 不需要创建文件,文件输出流找不到文件,会自动创建新文件 try ( FileOutputStream fileOutputStream = new FileOutputStream(file, false); ) { byte[] bytes = new byte[1024]; int count = 0; while ((count = inputStream.read(bytes)) != -1) { fileOutputStream.write(bytes, 0, count); } System.out.println("资源下载完成: " + directory + ":" + fileName); } catch (Exception e) { System.out.println("下载过程中出错: " + directory + ":" + fileName); } finally { if (!Objects.isNull(inputStream)) { inputStream.close(); } } } // 判断url资源是否存在,有的jar包在仓库里不存在,不存在的就略过,存在返回输入流 private static InputStream existUrl(String url) { try { URL u = new URL(url); URLConnection urlConnection = u.openConnection(); urlConnection.setRequestProperty("Authorization", AUTHOR); urlConnection.connect(); InputStream inputStream = urlConnection.getInputStream(); return inputStream; } catch (Exception e) { return null; } } }
关键代码
用户名密码认证
注意:"Basic "
这里有一个空格,忘记会认证失败。
private static final String USERNAME_PASSWORD = "用户名" + ":" + "密码"; // 编码用户名和密码,拼接成认证信息 private static final String AUTHOR = "Basic " + Base64.getEncoder().encodeToString(USERNAME_PASSWORD.getBytes());
从url到获取文件输入流的过程
URL u = new URL(url); URLConnection urlConnection = u.openConnection(); urlConnection.setRequestProperty("Authorization", AUTHOR); urlConnection.connect(); InputStream inputStream = urlConnection.getInputStream();
文件保存
不用执行创建文件的操作,输出流如果找不到文件,会自动创建文件,但是目录要主动创建,输出流找不到目录会报错,所以在创建输出流之前,要确保目录存在。
创建输出流的第二个参数false
,表示如果此文件存在,则从文件头部重新写入而不是追加,简单说就是覆盖已存在文件。
File path = new File(DIRECTORY_HEAD + directory); if (!path.exists()) { path.mkdirs(); } FileOutputStream fileOutputStream = new FileOutputStream(file, false);
这篇关于java根据url下载文件,并且解决资源验证需要用户名密码问题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-07-04TiDB 资源管控的对撞测试以及最佳实践架构
- 2024-07-03万字长文聊聊Web3的组成架构
- 2024-07-02springboot项目无法注册到nacos-icode9专业技术文章分享
- 2024-06-26结对编程到底难不难?答案在这里
- 2024-06-19《2023版Java工程师》课程升级公告
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现