Android ZIP 打包

假设 文件/文件夹 分布如下:

dir0/file0
dir0/dir1/file1
dir0/dir2/file2

可以用递归遍历所有文件并打包,那么压缩包结构为:

zip/file0
zip/file1
zip/file2

如果想维持原来的 文件/文件夹 分布结构,即期望的压缩包结构为:

zip/dir0/file0
zip/dir0/dir1/file1
zip/dir0/dir2/file2

那么就要注意 绝对路径相对路径 的问题,下面是参考代码:

    /*
     * Usage: zipDirectory("/sdcard/resource", "/sdcard/log.zip");
     */
    public static boolean zipDirectory(String sourcePath, String zipFilePath) {
        final int BUFFER = 2048;
        File sourceFile = new File(sourcePath);

        try {
            BufferedInputStream bufferedInputStream = null;
            FileOutputStream fileOutputStream = new FileOutputStream(zipFilePath);
            ZipOutputStream zipOutputStream = new ZipOutputStream(new BufferedOutputStream(
                    fileOutputStream));

            if (sourceFile.isDirectory()) {
                zipSubDirectory(zipOutputStream, sourceFile, sourceFile.getParent().length());
            } else {
                byte data[] = new byte[BUFFER];
                FileInputStream fileInputStream = new FileInputStream(sourcePath);
                bufferedInputStream = new BufferedInputStream(fileInputStream, BUFFER);
                ZipEntry zipEntry = new ZipEntry(getLastPathComponent(sourcePath));
                zipOutputStream.putNextEntry(zipEntry);
                int count;
                while ((count = bufferedInputStream.read(data, 0, BUFFER)) != -1) {
                    zipOutputStream.write(data, 0, count);
                }
            }
            zipOutputStream.close();
        } catch (Exception e) {
            e.printStackTrace();

            return false;
        }

        return true;
    }

    /*
     * Zips a subfolder
     */
    private static void zipSubDirectory(ZipOutputStream zipOutputStream,
            File directory,
            int basePathLength)
                    throws IOException {

        final int BUFFER = 2048;

        File[] fileList = directory.listFiles();
        BufferedInputStream bufferedInputStream = null;

        for (File file : fileList) {
            if (file.isDirectory()) {
                zipSubDirectory(zipOutputStream, file, basePathLength);
            } else {
                byte data[] = new byte[BUFFER];
                String unmodifiedFilePath = file.getPath();
                String relativePath = unmodifiedFilePath
                        .substring(basePathLength);
                FileInputStream fileInputStream = new FileInputStream(unmodifiedFilePath);
                bufferedInputStream = new BufferedInputStream(fileInputStream, BUFFER);
                ZipEntry zipEntry = new ZipEntry(relativePath);
                zipOutputStream.putNextEntry(zipEntry);
                int count;
                while ((count = bufferedInputStream.read(data, 0, BUFFER)) != -1) {
                    zipOutputStream.write(data, 0, count);
                }
                bufferedInputStream.close();
            }
        }
    }

    /*
     * gets the last path component Example:
     * getLastPathComponent("/sdcard/fileToZip"); Result: "fileToZip"
     */
    public static String getLastPathComponent(String filePath) {
        String[] segments = filePath.split("/");
        String lastPathComponent = segments[segments.length - 1];
        return lastPathComponent;
    }

代码写得比较潦草,先凑合着用吧,有闲的时候再优化一下。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,026评论 19 139
  • Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
    萤火虫de梦阅读 99,638评论 9 467
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,714评论 25 709
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,242评论 2 33
  • 文启光的人已溃不成军,偶有几个拼死抵抗的,依然挡不住攻城的大势所趋,我们并未费了太多周折,轻易便进了霞荫关。 城中...
    冷清持阅读 668评论 3 13