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; }
相关文章推荐
- Android粒子雨效果之音量条显示
- Andro 4000 id内存泄漏(Handler造成的内存泄漏(一))
- Android 高低版本中的一些差异性
- 学习Android,做报告的感想
- Android布局优化——merge与ViewStub
- Android 自动填写短信验证码 两种实现(二)
- 使用AndroidStudio进行NDK开发简单配置
- RecyclerView android:layout_width="match_parent"无效
- Android Sax解析XML出现空值或脏数据的解决方案
- Android RecyclerView 完全解析
- Android中的内存泄露(一.内存泄漏的认识以及LeakCannry的基本用法)
- Android开发中混淆代码总结
- Android——DrawerLayout滑动范围的设置
- Android ListView实现通讯录的实例
- 调用Android中相机或图库选择图片并剪切
- 调用Android的相机与图库并进行剪切
- <Android学习笔记五>Android系统自带样式(android:theme)详解
- android 读取资源文件的数据
- 支付宝支付
- Android Studio 2.2 Preview 2 生成的界面问题