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

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

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


                           

                  解压代码如下:

/**
	 * 含子目录的文件压缩
	 * 
	 * @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开发基础
上一篇快速入门HTML-----入门HTML必看的文章
下一篇Android文件解压工具类
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭