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

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

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

關鍵類

能夠概括起來全部跟文件操做相關的流程都要下面這幾個類java

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

解壓縮流程

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

  • getNextEntry()

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

test/a/b/c/file.txtui

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

a/b/c/file.txtcode

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();
}
複製代碼

完整代碼

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

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();
        }
    }
}複製代碼
相關文章
相關標籤/搜索