初次使用Zip的壓縮和解壓,只是簡單使用
1、android中Zip的壓縮:
- Zip的壓縮主要用到了ZipOutputStream和ZipEntry類
- 小例子如下:
public String zipFileOptions(){
//創(chuàng)建壓縮文件的路徑
String zipFileName = Environment.getExternalStorageDirectory()
+ "/" + UUID.randomUUID().toString().replace("-", "") + ".zip";
//創(chuàng)建壓縮的文件對象
File zipFile = new File(zipFileName);
//創(chuàng)建InputStream對象
InputStream is = null;
//創(chuàng)建ZipOutputStream對象
ZipOutputStream zos = null;
try{
//獲取ZipOutputStream對象實(shí)例
zos = new ZipOutputStream(new FileOutputStream(zipFile));
zos.setComment("hello");
}catch(FileNotFoundException e){
e.printStackTrace();
}
//FileBean中保存有需要壓縮的文件的文件路徑换况,mFileList中保存了所有需要被壓縮的文件路徑
for(FileBean bean : mFileList){
//根據(jù)路徑,創(chuàng)建需要被壓縮的文件對象,bean.getUrlPath()獲取到的是文件的路徑
File file = new File(bean.getUrlPath());
try{
//獲取輸入流對象
is = new FileInputStream(file);
zos.setNextEntry(new ZipEntry(file.getName()));
byte[] buffer = new byte[8*1024];
int length = 0;
while((length=is.read(buffer))!=-1){
//將文件寫進(jìn)壓縮流
zos.write(buffer,0,length);
}
is.close();
}catch(Exception e){
e.printStackTrace();
}
}
try{
zos.close();
}catch(Exception e){
e.printStackTrace();
}
return zipFileName;
}
注意:文件的壓縮相對來說比較耗費(fèi)時間,因此抵碟,不能在主線程中進(jìn)行操作,需要另起線程進(jìn)行操作坏匪,以上例子用到的是AsyncTask拟逮。
2、Zip的下載:
- 下載文件用到了java原始的API适滓,在下載之前敦迄,首先需要獲得被下載文件的URL。
- 然后自定義一個本地的文件路徑凭迹,用于裝載下載的Zip文件罚屋。
- 然后在異步任務(wù)中進(jìn)行文件的下載。
- 小例子如下:
/**
* 文件的下載方法
* @param url 文件的URL
* @param out 文件需要下載到的指定路徑目錄嗅绸,需要自定義創(chuàng)建該路徑
**/
public File downloadZipFile(String url,String out){
//定義URL對象
URL mURL = null;
//定義File對象
File mFile = null;
//定義URLConnection對象
URLConnection urlConnection = null;
int byteCopies = 0;
//定義FileOutputStream對象
FileOutputStream mOutputFileStream = null;
try{
//創(chuàng)建URL實(shí)例
mURL = new URL(url);
//獲取文件的名稱
String fileName = new File(mURL.getFile()).getName();
//根據(jù)指定文件目錄和文件名稱來創(chuàng)建文件
mFile = new File(out,fileName);
//獲取URLConnection對象
urlConnection = mURL.openConnection();
//獲取文件的長度
int length = urlConnection.getContentLength();
//如果文件已經(jīng)存在
if (mFile.exists()&&length==mFile.length) {
return mFile;
}
//獲取FileOutputStream對象
mOutputFileStream = new FileOutputStream(mFile);
//獲取InputStream對象
InputStream is = urlConnection.getInputStream();
//設(shè)置緩沖區(qū)的大小
byte[] buffer = new byte[8*1024];
//創(chuàng)建BufferedInputStream對象
BufferedInputStream bis = new BufferedInputStream(is,8*1024);
//創(chuàng)建BufferedOutputStream對象
BufferedOutputStream bos = new BufferedOutputStream(mOutputFileStream,8*1024);
int n = 0;
while((n = bis.read(buffer,0,8*1024)) != -1){
bos.write(buffer,0,n);
}
//清空緩沖區(qū)
bos.flush();
return mFile;
}catch(Exception e){
e.printStackTrace();
}finally{
try{
bos.close();
bis.close();
}catch(Exception e){
e.printStackTrace();
}
}
return null;
}
Zip的解壓:
- 首先需要獲取到下載到的壓縮文件
- 完了以后通過異步任務(wù)對文件進(jìn)行壓縮
- 下面的小例子通過解壓出來的文件名稱脾猛,再加上指定的文件目錄來保存解壓出來的文件
- 小例子:
/**
* 進(jìn)行文件解壓的方法
* @param file 下載回來的壓縮文件
**/
public List<File> unZipFile(File file){
//創(chuàng)建集合,保存解壓出來的文件
List<File> mFileList = new ArrayList<>();
//定義解壓出來的文件對象
File outFile = null;
try{
//創(chuàng)建ZipFile對象
ZipFile mZipFile = new ZipFile(file);
//創(chuàng)建ZipInputStream對象
ZipInputStream zis = new ZipInputStream(new FileInputStream(file));
//創(chuàng)建ZipEntry對象
ZipEntry zipEntry = null;
//定義InputStream對象
InputStream is = null;
//定義OutputStream對象
OutputStream os = null;
while((zipEntry=zis.getNextEntry())!=null){
//拼湊路徑朽砰,創(chuàng)建解壓出來的文件對象
outFile = new File(Environment.getExternalStorageDirectory()
+ "/vaeh" + File.separator + zipEntry.getName());
//判斷父級目錄是否存在
if (!outFile.getParentFile().exists()) {
//創(chuàng)建父級目錄
outFile.getParentFile().mkdir();
}
//判斷文件是否存在
if (!outFile.exists()) {
//創(chuàng)建文件
outFile.createNewFile();
}
//獲取is的實(shí)例
is = mZipFile.getInputStream(zipEntry);
os = new FileOutputStream(outFile);
//創(chuàng)建緩沖區(qū)
byte[] buffer = new byte[8*1024];
int length = 0;
while((length=is.read(buffer))!=-1){
os.write(buffer,0,length);
}
//這里加多一次判斷是為了保險起見尖滚,防止出現(xiàn)空指針
if (outFile.exists()) {
//將文件保存到集合中
mFileList.add(outFile);
}
is.close();
os.close();
}
}catch(Exception e){
e.printStackTrace();
}
return mFileList;
}