关闭

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

标签: Android解压文件Android文件解压嵌套子目录Android含有子目录文件解压Android含有多级目录文件解压
751人阅读 评论(1) 收藏 举报
分类:

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

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


                           

                  解压代码如下:

/**
	 * 含子目录的文件压缩
	 * 
	 * @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嵌套目录的解压方法,如果大家需要单层目录的解压方法,请参考我的其他博客,共勉。

       


1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:22915次
    • 积分:64
    • 等级:
    • 排名:千里之外
    • 原创:23篇
    • 转载:1篇
    • 译文:0篇
    • 评论:5条
    最新评论