import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
public class zip壓縮與解壓 {
public static void main(String[] args) {
// compression("C:\\Users\\puban\\Desktop\\b.zip", new File("C:\\Users\\puban\\Desktop\\設計稿"));
deCompression("C:\\\\Users\\\\puban\\\\Desktop\\\\b.zip", "C:\\Users\\puban\\Desktop\\java");
}
// 文件夾和文件壓縮
/**
* @param zipFilePath 壓縮后的文件路徑;
* @param targetFile 需要壓縮的文件
*/
public static void compression(String zipFilePath, File targetFile) {
try {
if (zipFilePath == null || targetFile == null) return;
// zip輸出流:寫入文件
ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(zipFilePath));
// 設置壓縮等級
zipOutputStream.setLevel(1);
// 加入緩存
BufferedOutputStream bos = new BufferedOutputStream(zipOutputStream); // 加入到緩存
zip(zipOutputStream, targetFile, targetFile.getName(), bos);
// 關閉流
bos.close();
zipOutputStream.close();
System.out.println("壓縮成功");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @param zipOutputStream zip輸出流
* @param targetFile 壓縮的文件
* @param name 壓縮的名字
* @param bos 緩存
*/
private static void zip(ZipOutputStream zipOutputStream, File targetFile, String name, BufferedOutputStream bos) throws IOException {
// 如果是文件夾
if (targetFile.isDirectory()) {
File[] files = targetFile.listFiles(); // 獲取所有文件
// 如果是空文件夾,也要壓縮
if (files.length == 0) {
zipOutputStream.putNextEntry(new ZipEntry(name + "/"));
}
System.out.println(name);
for (File f : files) {
// 遞歸處理
// name : 文件夾名字+f.separator(分割符號)+文件名稱
zip(zipOutputStream, f, name + f.separator + f.getName(), bos);
}
} else {
// 如果是文件 寫入zip流
zipOutputStream.putNextEntry(new ZipEntry(name));
InputStream in = new FileInputStream(targetFile);
BufferedInputStream bis = new BufferedInputStream(in);
int len = -1;
byte[] bytes = new byte[1024];
while ((len = bis.read(bytes)) != -1) {
bos.write(bytes, 0, len);
bos.flush(); // 每次寫入完成之后都要刷新一下緩存,不然下一次生成文件就會文件錯誤
}
bis.close();
}
}
// 文件解壓
/**
* @param zipFilePath 要壓縮文件路徑
* @param newPathParent 放在哪個路徑
*/
public static void deCompression(String zipFilePath, String newPathParent) {
try {
// 輸出流
ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(zipFilePath));
File file = null;
ZipEntry zipEntry = null;
while ((zipEntry = zipInputStream.getNextEntry()) != null && !zipEntry.isDirectory()) {
// 這里包括文件文件夾的創建
file = new File(newPathParent, zipEntry.getName());
// 如果這個不是文件,就創建上級文件夾
if (!file.exists()) {
new File(file.getParent()).mkdir();
}
// 寫入文件
OutputStream out = new FileOutputStream(file);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(out);
int len = -1;
byte[] bytes = new byte[1024];
while ((len = zipInputStream.read(bytes)) != -1) {
bufferedOutputStream.write(bytes, 0, len);
bufferedOutputStream.flush(); // 刷新緩存
}
bufferedOutputStream.close();
}
System.out.println("解壓成功");
zipInputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
java二十(文件的壓縮和解壓)
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
推薦閱讀更多精彩內容
- zlib的一些函數: zlib.adler32(s [,crc]) 返回字符串的Adler32校驗碼。參數''c...
- minizip 的使用方法: ziparchive是基于開源代碼”MiniZip”的zip壓縮與解壓的Object...
- Zip文件結構 ZIP文件結構如下圖所示, File Entry表示一個文件實體,一個壓縮文件中有多個文件實體。 ...
- 由于.rar的安裝要使用rarlinux,所以首先要下載rarlinux,然后安裝它。安裝過程如下: 下載rarl...