javaweb通过接口来实现多个文件压缩和下载(包括单文件下载,多文件批量下载)
??程序員在做web等項目的時候,往往都需要添加文件上傳、下載、刪除的功能,有時是單文件,有時多文件批量 操作,而這些功能的代碼程序員可以自己收藏起來當成工具使用,這樣,程序員在進行程序設計的時候就會事半功倍 了,那么接下來的博客將會介紹各個框架的文件上傳和下載功能的使用方法。?
? 這篇博文主要是講如何將多個文件壓縮并下載下來:
?主要有以下幾個步驟:
1。 首先先遍歷出某個文件夾所含有的所有文件
import java.io.File; import java.util.Vector; public class A {public static void recursion(String root, Vector<String> vecFile) { /*根據(jù)路徑生成一個文件*/File file = new File(root);File[] subFile = file.listFiles(); /*遍歷文件里面的所有文件*/for (int i = 0; i < subFile.length; i++) { /*如果是文件夾,則遞歸下去尋找文件夾里面的文件*/ if (subFile[i].isDirectory()) { recursion(subFile[i].getAbsolutePath(), vecFile); } else { /*如果不是文件夾的話就直接添加到vector容器里面去 (vector類稱作向量類,它實現(xiàn)了動態(tài)數(shù)組,用于元素數(shù)量變化的對象數(shù)組。像數(shù)組一樣,vector類也用從0開始的下標表示元素的位置;但和數(shù)組不同的是,當vector對象創(chuàng)建后,數(shù)組的元素個數(shù)會隨著vector對象元素個數(shù)的增大和縮小而自動變化。)*/ 2.將遍歷出來的文件進行壓縮和下載:String filename = subFile[i].getName();vecFile.add(filename);}}}public static void main(String[] args) {Vector<String> vecFile = new Vector<String>();recursion("D:/logs/2", vecFile);for (String fileName : vecFile) {System.out.println(fileName);}} }2。 將遍歷出來的文件進行壓縮和下載:(一個一個壓縮)
2.1 設置下載文件的名稱
2.2 創(chuàng)建壓縮文件需要的空的zip包
2.3 根據(jù)臨時的zip壓縮包路徑,創(chuàng)建zip文件
2.4?創(chuàng)建zip文件輸出流
2.5?循環(huán)讀取文件路徑集合,獲取每一個文件的路徑(將文件一個一個進行壓縮)
2.6?將打包后的文件寫到客戶端,有兩種方法可以實現(xiàn)(下面會進行介紹),這里使用緩沖流輸出
2.7?釋放和關閉輸入輸出流
2.8?文件壓縮的方法
這個是我在團隊中的一個項目開發(fā)過程。在這個過程中,我主要遇到了幾個常見的問題,不過最后都一一被我解決掉了。
1. 因為我要下載壓縮的文件是一個日志不斷動態(tài)生成的文件,所以需要先對其復制到另外一個文件夾再進行壓縮以及下載;
2. 對IO流的一些 知識不是很熟悉(學習并參考:https://blog.csdn.net/weixin_37766296/article/details/80070847)
文件從一個文件夾復制到另一個文件夾:
// 讀寫文件public static void copy1() throws Exception{ FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\1\\log.txt");(原文件路徑) FileOutputStream fos = new FileOutputStream("D:\\java1\\eclipse\\javadownload\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp1\\wtpwebapps\\SCNU_OAuth2\\logs\\1\\log.txt"); int len = 0; byte[] buf = new byte[1024]; while ((len = fis.read(buf)) != -1) { fos.write(buf, 0, len); } fos.close(); fis.close(); } /*復制過去之后格式發(fā)生了變化,故放棄這個方法*/public void copy2() {FileWriter fw = null;BufferedReader br = null;try {fw = new FileWriter("D:\\java1\\eclipse\\javadownload\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp1\\wtpwebapps\\SCNU_OAuth2\\logs\\1\\log.txt",true);br = new BufferedReader(new InputStreamReader(new FileInputStream("C:\\Users\\Administrator\\Desktop\\1\\log.txt"), "UTF-8"));(原文件路徑)String line = null;while ((line = br.readLine()) != null) {// System.out.println("文件內(nèi)容: " + line);fw.write(line);fw.flush();}br.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if (fw != null) {try {fw.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}對于單個文件下載:
可以參考:https://blog.csdn.net/alan_liuyue/article/details/72772502
參考博文:https://blog.csdn.net/alan_liuyue/article/details/72772502(里面關于流的關閉有點瑕疵)
總結(jié)
以上是生活随笔為你收集整理的javaweb通过接口来实现多个文件压缩和下载(包括单文件下载,多文件批量下载)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java时间聚类_mongodb 按照时
- 下一篇: 计算机考试400,400作文:电脑考试