java 項(xiàng)目總是有上傳 zip 包和下載 zip 包的需求,這時(shí)就得用 ZipInputStream 和 ZipOutputStream 類。
基礎(chǔ)概念
- ZipOutputStream:是一種 FilterInputStream 、裝飾器模式中的實(shí)現(xiàn)類,它可以直接讀取zip 包的內(nèi)容
- ZipOutputStream (OutputStream out):zip 輸出流
- ZipEntry(String name):表示壓縮文件中的一個(gè)文件或者目錄
- void putNextEntry(ZipEntry e):寫入新的壓縮文件或者目錄
- ZipIutputStream:是一種 FilterOutputStream, 可以實(shí)現(xiàn) zip 文件的解壓
- ZipIutputStream (IutputStream out):zip 輸入流
- ZipEntry getNextEntry():得到壓縮文件中的一個(gè)文件或者目錄
壓縮
壓縮文件就是先讀取一個(gè)文件夾的內(nèi)容,創(chuàng)建 ZipEntry 放入 ZipOutputStream 下,然后用 InputStream 讀取源文件內(nèi)容并寫入 ZipOutputStream。
/**
* 壓縮文件
* @param sourceFilePath 待壓縮的文件路徑
* @param zipFilePath 壓縮后存放路徑
* @return
*/
public static void zip(String sourceFilePath, String zipFilePath) {
File sourceFile = new File(sourceFilePath);
if (!sourceFile.exists()) {
System.out.println(sourceFilePath + " 不存在");
return;
}
File zipFile = new File(zipFilePath);
if (zipFile.exists()) {
System.out.println(zipFilePath + " 已經(jīng)存在");
return;
}
try {
byte[] buffer = new byte[1024];
try (ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile)))){
for(File file: sourceFile.listFiles()) {
// 創(chuàng)建 ZIP 中的文件,并添加進(jìn)壓縮包
ZipEntry zipEntry = new ZipEntry(file.getName());
zos.putNextEntry(zipEntry);
// 讀取待壓縮的文件并寫進(jìn)壓縮包里
try (InputStream bis = new BufferedInputStream(new FileInputStream(file))){
int read = 0;
while ((read = bis.read(buffer)) != -1) {
zos.write(buffer, 0, read);
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
解壓
一個(gè)壓縮文件就是一個(gè)特殊的 File 叫做 ZipFile,用 Enumeration 類取出 zip 文件中被壓縮的文件。
List< String > fileNames=new ArrayList< >();
try{
ZipFile zipFile=new ZipFile(path, Charset.forName("gbk"));
Enumeration< ? extends ZipEntry > entries = zipFile.entries();
while(entries.hasMoreElements()){
String fileName=entries.nextElement().getName();
fileNames.add(fileName);
System.out.println("文件名稱: "+fileName);
}
}catch (Exception e){
e.printStackTrace();
}
解壓文件 就是先用 zipFile.entries() 讀取壓縮文件夾中的文件, 生成 InputStream 流后寫入被解壓的 輸出流
/**
* 解壓
* @param zipPath zip 文件夾路徑
* @param targetPath 解壓路徑
*/
public static void unzip(String zipPath,String targetPath){
File pathFile = new File(targetPath);
if(!pathFile.exists()){
pathFile.mkdirs();
}
try{
//指定編碼
try(ZipFile zipFile = new ZipFile(zipPath, Charset.forName("gbk"))) {
//遍歷里面的文件及文件夾
Enumeration entries = zipFile.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = (ZipEntry) entries.nextElement();
String zipEntryName = entry.getName();
try (InputStream in = zipFile.getInputStream(entry)) {
String outpath = (targetPath + File.separator + zipEntryName);
//判斷路徑是否存在,不存在則創(chuàng)建文件路徑
File file = new File(outpath.substring(0, outpath.lastIndexOf(File.separator)));
if (!file.exists()) {
file.mkdirs();
}
//判斷文件全路徑是否為文件夾
if (new File(outpath).isDirectory())
continue;
try (OutputStream out = new FileOutputStream(outpath)) {
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
}
}
}
}
}catch ( Exception e){
e.printStackTrace();
}
}
總結(jié)
介紹了一下 java 中的壓縮文件是如何解壓與壓縮的,對小伙伴們有幫助的話就點(diǎn)個(gè)贊哦。
-
JAVA
+關(guān)注
關(guān)注
19文章
2974瀏覽量
104984 -
Zip
+關(guān)注
關(guān)注
0文章
17瀏覽量
8654 -
壓縮
+關(guān)注
關(guān)注
2文章
102瀏覽量
19396 -
文件
+關(guān)注
關(guān)注
1文章
570瀏覽量
24803
發(fā)布評論請先 登錄
相關(guān)推薦
評論