Android ZIP 打包

作者: 几千里也 | 来源:发表于2015-07-29 14:24 被阅读258次

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

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;
    }

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

相关文章

网友评论

    本文标题:Android ZIP 打包

    本文链接:https://www.haomeiwen.com/subject/giwmqttx.html