Android解压文件(含有子目录,文件)

原创 2017年01月03日 19:30:19

                       最近在一个项目需要用到文件功能,服务端给的压缩包里面含有子目录,如果单纯解压一次是不成功的,需要递归来进行解压。

              服务端给的压缩包如图所示:


                           

                  解压代码如下:

/**
	 * 含子目录的文件压缩
	 * 
	 * @throws Exception
	 */
	// 第一个参数就是需要解压的文件,第二个就是解压的目录
	public static boolean upZipFile(String zipFile, String folderPath) {
		ZipFile zfile = null;
		try {
			// 转码为GBK格式,支持中文
			zfile = new ZipFile(zipFile);
		} catch (IOException e) {
			e.printStackTrace();
			return false;
		}
		Enumeration zList = zfile.entries();
		ZipEntry ze = null;
		byte[] buf = new byte[1024];
		while (zList.hasMoreElements()) {
			ze = (ZipEntry) zList.nextElement();
			// 列举的压缩文件里面的各个文件,判断是否为目录
			if (ze.isDirectory()) {
				String dirstr = folderPath + ze.getName();
				LogUtils.i(TAG, "dirstr=" + dirstr);
				dirstr.trim();
				File f = new File(dirstr);
				f.mkdir();
				continue;
			}
			OutputStream os = null;
			FileOutputStream fos = null;
			// ze.getName()会返回 script/start.script这样的,是为了返回实体的File
			File realFile = getRealFileName(folderPath, ze.getName());
			try {
				fos = new FileOutputStream(realFile);
			} catch (FileNotFoundException e) {
				LogUtils.e(TAG, e.getMessage());
				return false;
			}
			os = new BufferedOutputStream(fos);
			InputStream is = null;
			try {
				is = new BufferedInputStream(zfile.getInputStream(ze));
			} catch (IOException e) {
				LogUtils.e(TAG, e.getMessage());
				return false;
			}
			int readLen = 0;
			// 进行一些内容复制操作
			try {
				while ((readLen = is.read(buf, 0, 1024)) != -1) {
					os.write(buf, 0, readLen);
				}
			} catch (IOException e) {
				LogUtils.e(TAG, e.getMessage());
				return false;
			}
			try {
				is.close();
				os.close();
			} catch (IOException e) {
				LogUtils.e(TAG, e.getMessage());
				return false;
			}
		}
		try {
			zfile.close();
		} catch (IOException e) {
			LogUtils.e(TAG, e.getMessage());
			return false;
		}
		return true;
	}

	/**
	 * 给定根目录,返回一个相对路径所对应的实际文件名.
	 * 
	 * @param baseDir
	 *            指定根目录
	 * @param absFileName
	 *            相对路径名,来自于ZipEntry中的name
	 * @return java.io.File 实际的文件
	 */
	public static File getRealFileName(String baseDir, String absFileName) {
		LogUtils.i(TAG, "baseDir=" + baseDir + "------absFileName="
				+ absFileName);
		absFileName = absFileName.replace("\\", "/");
		LogUtils.i(TAG, "absFileName=" + absFileName);
		String[] dirs = absFileName.split("/");
		LogUtils.i(TAG, "dirs=" + dirs);
		File ret = new File(baseDir);
		String substr = null;
		if (dirs.length > 1) {
			for (int i = 0; i < dirs.length - 1; i++) {
				substr = dirs[i];
				ret = new File(ret, substr);
			}

			if (!ret.exists())
				ret.mkdirs();
			substr = dirs[dirs.length - 1];
			ret = new File(ret, substr);
			return ret;
		} else {
			ret = new File(ret, absFileName);
		}
		return ret;
	}

                以上就是Android嵌套目录的解压方法,如果大家需要单层目录的解压方法,请参考我的其他博客,共勉。

       


Android中文件的压缩和解压缩

使用场景当我们在应用的Assets目录中需要加入文件时,可以直接将源文件放入,但这样会造成打包后的apk整体过大,此时就需要将放入的文件进行压缩.又如当我们需要从服务器中下载文件时,如果下载源文件耗时...

Android文件下载,解压zip文件,清空文件夹

//保存retrofit下载下来的ResponseBody文件 public static File writeResponseBodyToDisk(okhttp3.ResponseBody bod...
  • Ser_Bad
  • Ser_Bad
  • 2017年02月10日 18:01
  • 533

Android--下载zip压缩文件并解压

网上有很多介绍下载文件或者解压zip文件的文章,但是两者结合的不多,在此记录一下下载zip文件并直接解压的方法,直接上代码。 源码下载:http://download.csdn.net/detail...

android解压ZIP文件

在AndroidManifest.xml里添加权限:      工具类: public class ZIP { public ZIP(){ } /** * D...

android 下载zip文件并解压

公司项目有个需求, 需要下载一个HTML文件压缩包到本地 用WebView显示html页面。网上找到了下面链接 修改了一下就可以自己用:    http://blog.csdn.net/hope...

Android Zip文件解压缩代码

在Android平台中如何实现Zip文件的解压缩功能呢? 因为Android内部已经集成了zlib库,对于英文和非密码的Zip文件解压缩还是比较简单的,下面Android123给大家一个解压缩zip的...

Android下文件的压缩和解压(Zip格式)

Zip文件结构ZIP文件结构如下图所示, File Entry表示一个文件实体,一个压缩文件中有多个文件实体。文件实体由一个头部和文件数据组,Central Directory由多个File head...
  • w2_2015
  • w2_2015
  • 2017年08月23日 16:34
  • 502

android实现zip解压

不废话,直接上代码: public static void unzip(String zipFilePath, String targetPath)           throws IOExce...

Android解压sd卡里面Zip压缩文件

1.权限  Android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 写SD卡的权限非常重要。 2.直接使用这个类就好了。 p...
  • bjstyle
  • bjstyle
  • 2017年05月23日 10:01
  • 530

Android中的Zip解压缩

import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android解压文件(含有子目录,文件)
举报原因:
原因补充:

(最多只允许输入30个字)