您的位置:首页 > 移动开发 > Android开发

Android自助餐之解析zip

2016-06-16 20:40 309 查看

Android自助餐之解析zip

Android自助餐之解析zip

获取文件的所有节点游标

遍历每个节点

处理一个节点

解压文件思路解压某个ZipFile到指定目标路径

直接用的代码

获取文件的所有节点游标

Enumeration entries = zipFile.entries();//ZipFile为java.util.zip.ZipFile


遍历每个节点

while(entries.hasMoreElements()){
//do something
}


处理一个节点

ZipEntry ze = (ZipEntry)entries.nextElement();
boolean b = ze.isDirectory();//是否是目录
String name = ze.getName();获取文件/文件夹名称
String name = new String(name.getBytes("8859_1"),"gb2312");//文件名转码
InputStream is = new BufferedInputStream(zipFile.getInputStream(ze));//从该节点获取输入流(输入到内存,ze必须不是目录)
zipFile.close();//关闭zip文件


解压文件思路(解压某个ZipFile到指定目标路径)

获取并遍历每个节点

逐个处理节点

如果节点是目录

获取该文件夹名称并拼接到目标路径后面

路径名转码

调用mkdir()创建该文件夹

如果该节点是文件

根据节点名和指定路径名获取实际目标文件名

/
分割节点名字符串(除了最后一个外均为路径)

如果分割后字符串数组长度大于1,说明需要先创建文件夹

遍历分割后的字符串数组(除最后一个)并逐个拼接到目标解压路径后,将新的字符串转码并调用mkdirs()逐级创建文件夹

将最后一个字符串转码并拼接到刚才的路径字符串上并调用createNewFile()创建文件,此时已得到该节点的目标文件

根据目标文件创建输出流,根据节点创建输入流

从输入流读取数据复制到输出流,具体操作见[流操作][流操作]:/article/3618983.html

关闭zip文件

直接用的代码

/**解压zip文件到指定路径*/
public static void unpackZipFile(ZipFile zipFile,String folderPath) {
Enumeration entries = zipFile.entries();
ZipEntry ze=null;
byte[] buf=new byte[1024];
//遍历节点
while (entries.hasMoreElements()){
ze= (ZipEntry) entries.nextElement();
//region 该节点是目录
if(ze.isDirectory()){
String dirstr= folderPath+ze.getName();//获取文件夹名称
try {
//创建文件夹
dirstr=new String(dirstr.getBytes("8859_1"),"gb2312");
File f=new File(dirstr);
f.mkdir();
}catch (Exception e){
e.printStackTrace();
}
continue;
}
//endregion
//region 该节点是文件
try {
//创建IO流复制文件
OutputStream os = new BufferedOutputStream(new FileOutputStream(getRealFileName(folderPath, ze.getName())));
InputStream is = new BufferedInputStream(zipFile.getInputStream(ze));
int readLen=0;
while ((readLen=is.read(buf,0,1024))!=-1){
os.write(buf,0,readLen);
}
is.close();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
//endregion
}
//关闭文件
try {
zipFile.close();
} catch (Exception e) {
e.printStackTrace();
}
}

/**根据相对路径获取并创建绝对路径*/
private static File getRealFileName(String baseDir,String absFileName){
String[] dirs=absFileName.split("/");//获取逐级相对路径
File ret=new File(baseDir);//用于记录每一级路径
String substr=null;
if(dirs.length>1) {
//循环遍历不包括最后一个节点,因为该节点不是路径,独立处理
for (int i = 0; i < dirs.length - 1; i++) {
substr = dirs[i];
try {
substr = new String(substr.getBytes("8859_1"), "gb2312");
} catch (Exception e) {
e.printStackTrace();
}
ret = new File(ret, substr);//记录该级路径
}
//创建每级目录
if (!ret.exists()) {
ret.mkdirs();
}
}
//处理最后一个节点
substr=dirs[dirs.length-1];
try{
substr=new String(substr.getBytes("8859_1"),"gb2312");
}catch (Exception e){
e.printStackTrace();
}
ret=new File(ret,substr);
if(!ret.exists()){
try {
ret.createNewFile();
} catch (Exception e) {
e.printStackTrace();
}
}
return ret;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: