帶你走進Android之基礎篇文件解壓縮

NO IMAGE

嗨,你終於來啦~
等你好久啦~
從今天開始每天分享一篇Android需要了解的知識點,喜歡的小夥伴歡迎關注,我會定期分享Android知識點及解析,還會不斷更新的BATJ面試專題,歡迎大家前來探討交流,如有好的文章也歡迎投稿。

最近會貢獻一些平時開發中積累下來的工具類,希望能免去大家造輪子的體力活。
今天貢獻一個解壓縮zip文件的工具。

關鍵類

可以歸納起來所有跟文件操作相關的流程都要下面這幾個類

  • File
  • InputStream
  • OutputStream
    解壓縮也一樣,用於解壓縮的工具類是這三個,
  • ZipFile
  • ZipInputStream
  • FileOutputStream

解壓縮流程

首先實例化ZipFile對象,
通過InputStream讀取流,ZipInputStream提供了一個方法

  • getNextEntry()

返回一個 ZipEntry對象。這個對象所表示的意義是壓縮/解壓的文件信息,可以是文件夾,也可以是文件。
所以在獲取ZipEntry的之後,如果用 getName()拿它的文件名的話,
會以路徑+文件名的形式呈現。
比方我們現在有壓縮文件 test.zip,
源文件 test/ 下面存在這麼個層級結構,

test/a/b/c/file.txt

那麼在解壓縮的時候,我們拿到的file.txt的 ZipEntry的 name會是下面這樣

a/b/c/file.txt

ZipEntry 的獲取是在循環裡不斷迭代的,
而我們所獲取到的 ZipEntry不僅會包括 file.txt文件,
同時也包括 a、b、c三個文件夾,
這也是為什麼下面給出的工具類裡會有這段代碼的原因。

String fileName = zipEntry.getName();
if(fileName != null && fileName.contains(MAC_IGNORE)) {
continue;
}
File temp = new File(targetPath + File.separator + fileName);
if(zipEntry.isDirectory()) {
File dir = new File(targetPath + File.separator + fileName);
dir.mkdirs();
continue;
}
if (temp.getParentFile() != null && !temp.getParentFile().exists()) {
temp.getParentFile().mkdirs();
}

完整代碼

解壓縮的思路在上面已經描述了,下面給出完整代碼:

public class UnzipUtil {
//過濾在mac上壓縮時自動生成的__MACOSX文件夾
private static final String MAC_IGNORE = "__MACOSX/";
public static void decompressFile(String target, String source) {
if(TextUtils.isEmpty(target)){
return;
}
try {
File file = new File(source);
if(!file.exists()) {
return;
}
ZipFile zipFile = new ZipFile(file);
ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(file));
ZipEntry zipEntry = null;
while ((zipEntry = zipInputStream.getNextEntry()) != null) {
String fileName = zipEntry.getName();
if(fileName != null && fileName.contains(MAC_IGNORE)) {
continue;
}
File temp = new File(target + File.separator + fileName);
if(zipEntry.isDirectory()) {
File dir = new File(target + File.separator + fileName);
dir.mkdirs();
continue;
}
if (temp.getParentFile() != null && !temp.getParentFile().exists()) {
temp.getParentFile().mkdirs();
}
byte[] buffer = new byte[1024];
OutputStream os = new FileOutputStream(temp);
// 通過ZipFile的getInputStream方法拿到具體的ZipEntry的輸入流
InputStream is = zipFile.getInputStream(zipEntry);
int len = 0;
while ((len = is.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
os.close();
is.close();
}
zipInputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

相關文章

作為Android開發者你真的知道Android按下開機鍵到啟動發生什麼嗎?

想做架構師?你真的明白Android事件分發機制嗎?

帶你走進Android之基礎篇Bitmap加載

Android架構組件讓天下沒有難做的App