前言
在进行C站的Java认证C4的模拟考试中遇到了一道关于远程下载zip文件并解压到指定目录中,再对解压后的文件进行单独的加密的题目,在模拟考试结束后又对内容进行一次实现,在实现的过程百度了很多的内容,但是很少能够遇到有帮助的回答,因此将用到的知识以及实现的思路和实现后的理解与心得在此进行记录。
一、已知内容
- 远程文件的地址:https://xxxxxx.xxxxx.xxxxxxx.com/xxxxx/xxxxx.文件名后缀
- 文件下载的后缀:.zip文件
二、实现过程
1. 使用对象
- BufferedInputStream:创建一个BufferedInputStream并保存其参数,即输入流in,用来读取文本文件内容。
- BufferedOutputStream:创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
- HttpURLConnection:创建一个支持HTTP特定功能的URLConnection。每个HttpURLConnection实例都可用于生成单个请求,实例可以透明地共享连接到 HTTP 服务器的基础网络。
- URL:代表一个统一资源定位符,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用。
- FileOutputStream:创建一个向指定File对象表示的文件中写入数据的文件输出流,用于将数据写入File对象中。
2. 实现思路
- 在类中定义了两个分别表示要下载的文件的名称(这里是自定义下载的文件名并且包括文件名后缀)以及文件的存储路径的全局属性。
- 分别声明BufferedInputStream、BufferedOutputStream和HttpURLConnection对象,在实例化URL对象时将远程文件的路径作为参数,声明一个指向要下载对的文件的网络资源的指针。
- 将指向资源的指针url强转为支持HTTP下载功能的HttpURLConnection连接对象。
- 因为此时的HttpURLConnection对象是一个支持HTTP下载功能的URLConnection对象,因此可以调用URLConnection对象中的connect()方法打开到刚才指定下载路径的资源的通信链接。
- 开启输入流,并将输出流输写入到本地指定的位置中。
3. 实现代码
packagecom.shijimo.C4.util; importnet.lingala.zip4j.ZipFile; importnet.lingala.zip4j.exception.ZipException; importorg.junit.Test; importjava.io.*; importjava.net.HttpURLConnection; importjava.net.URL; /*** @author Dream_飞翔* @date 2021/10/12* @time 0:10* @email 1072876976@qq.com** 对文件进行操作的工具类*/publicclassFileUtil { // 定义要下载的zip文件的名称StringzipName="download.zip"; // 定义下载文件的存储路径StringlocalFilePath="\\C4\\project1\\file\\"; /*** 从远程下载文件并将下载的文件存储到本地*/publicvoiddownloadFile() throwsIOException { BufferedInputStreamin=null; BufferedOutputStreamout=null; HttpURLConnectionhttpUrl=null; try { // 定义要进行远程下载的路径URLurl=newURL("https://这里就是下载远程文件的地址"); httpUrl= (HttpURLConnection) url.openConnection(); // 开启文件下载路径的连接httpUrl.connect(); // 开启输入流in=newBufferedInputStream(httpUrl.getInputStream()); // 将获取到的文件输出到输出流当中out=newBufferedOutputStream(newFileOutputStream(localFilePath+zipName)); // 定义远程下载的文件最大为2MBintlen=2048; byte[] bytes=newbyte[len]; // 将输出流写到本地目录中while ((len=in.read(bytes)) !=-1) { out.write(bytes, 0, len); } // 将流关闭out.close(); in.close(); httpUrl.disconnect(); } catch (IOExceptione) { e.printStackTrace(); } finally { // 将流对象关闭out.close(); in.close(); httpUrl.disconnect(); } } }
在这里我使用了Junit4进行测试方法是否可以成功的将文件进行远程下载
四、运行结果
在运行前本地存储文件的目录为空
在运行了刚才写的方法之后
总结
在实现了这个小的功能的过程中深刻的意识到我目前对于IO流的掌握还有欠缺,而且在接触了SSM框架以及SpringBoot之后对JavaSE的基础的重视程度更加不足,在模拟考试的过程中深刻的意识到了这一点后,更要加强对Java基础的掌握与重视。同时在实现这个功能的过程中我也更加的理解IO流,感谢C4!