最近會貢獻一些平時開發中積累下來的工具類,但願能免去你們造輪子的體力活。
今天貢獻一個解壓縮zip文件的工具。javascript
能夠概括起來全部跟文件操做相關的流程都要下面這幾個類java
首先實例化ZipFile對象,
經過InputStream讀取流,ZipInputStream提供了一個方法面試
返回一個 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();
}
}
}複製代碼