如何解压缩文件在Android中执行特定文件夹?

时间:2014-10-29 16:46:13

标签: android unzip

我正在根据官方文档和一些示例解压缩文件。我当前的实现将文件解压缩到zip文件所在的同一目录中。我想解压缩到我设备中的特定目录。我怎样才能做到这一点? ZipInputStream是否允许此功能,还是必须解压缩然后将文件移动到所需的文件夹?

这是我的代码:

public static boolean unpackZip(String path, String zipname) {
    InputStream is;
    ZipInputStream zis;
    try {
        String filename;
        is = new FileInputStream(path + zipname);
        zis = new ZipInputStream(new BufferedInputStream(is));
        ZipEntry ze;
        byte[] buffer = new byte[1024];
        int count;

        while ((ze = zis.getNextEntry()) != null) {
            filename = ze.getName();

            if (ze.isDirectory()) {
                File fmd = new File(path + filename);
                fmd.mkdirs();
                continue;
            }

            FileOutputStream fout = new FileOutputStream(path + filename);

            while ((count = zis.read(buffer)) != -1) {
                fout.write(buffer, 0, count);
            }

            fout.close();
            zis.closeEntry();
        }

        zis.close();
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }

    return true;
}

3 个答案:

答案 0 :(得分:1)

您需要通过拆分字符串来创建文件夹:

                if (filename.contains("/")){
                String[] folders = filename.split("/");
                for (String item : folders)
                {
                    File fmd = new File(path + item);
                    if (!item.contains(".") && !fmd.exists()){
                        fmd.mkdirs();
                        Log.d("created folder", item);
                    }
                }
            }

完整代码:

public static boolean unpackZip(String path, String zipname) {
InputStream is;
ZipInputStream zis;
try {
    String filename;
    is = new FileInputStream(path + zipname);
    zis = new ZipInputStream(new BufferedInputStream(is));
    ZipEntry ze;
    byte[] buffer = new byte[1024];
    int count;

    while ((ze = zis.getNextEntry()) != null) {
        filename = ze.getName();

        if (ze.isDirectory()) {
            File fmd = new File(path + filename);
            fmd.mkdirs();
            continue;
        }
            //ADD THIS//
            if (filename.contains("/")){
                String[] folders = filename.split("/");
                for (String item : folders)
                {
                    File fmd = new File(path + item);
                    if (!item.contains(".") && !fmd.exists()){
                        fmd.mkdirs();
                        Log.d("created folder", item);
                    }
                }
            }

        FileOutputStream fout = new FileOutputStream(path + filename);

        while ((count = zis.read(buffer)) != -1) {
            fout.write(buffer, 0, count);
        }

        fout.close();
        zis.closeEntry();
    }

    zis.close();
} catch (IOException e) {
    e.printStackTrace();
    return false;
}

return true;

}

答案 1 :(得分:0)

File fmd = new File(path + filename);FileOutputStream fout = new FileOutputStream(path + filename);中打开文件的位置,您可以简单地添加目标目录,因为path + filename只是文件的路径。我不确定你在这种情况下传递的路径是什么,我假设zip文件的路径,如果你想在其他地方提取你需要传递另一个变量与目标。类似的东西:

public static boolean unpackZip(String path, String zipname, String outputPath) {
    InputStream is;
    ZipInputStream zis;
    try {
        String filename;
        is = new FileInputStream(path + zipname);
        zis = new ZipInputStream(new BufferedInputStream(is));
        ZipEntry ze;
        byte[] buffer = new byte[1024];
        int count;

        while ((ze = zis.getNextEntry()) != null) {
            filename = ze.getName();

            if (ze.isDirectory()) {
                File fmd = new File(outputPath + filename);
                fmd.mkdirs();
                continue;
            }

            FileOutputStream fout = new FileOutputStream(outputPath + filename);

            while ((count = zis.read(buffer)) != -1) {
                fout.write(buffer, 0, count);
            }

            fout.close();
            zis.closeEntry();
        }

        zis.close();
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }

    return true;
}

答案 2 :(得分:0)

指定目标目录作为参数。除此之外,您的代码似乎还可以。

public static boolean unpackZip(String path, String zipname, String targetDirectory) {
    InputStream is;
    ZipInputStream zis;
    try {
        String filename;
        is = new FileInputStream(path + zipname);
        zis = new ZipInputStream(new BufferedInputStream(is));
        ZipEntry ze;
        byte[] buffer = new byte[1024];
        int count;

        while ((ze = zis.getNextEntry()) != null) {
            filename = ze.getName();

            if (ze.isDirectory()) {
                File fmd = new File(targetDirectory + filename);
                fmd.mkdirs();
                continue;
            }

            FileOutputStream fout = new FileOutputStream(targetDirectory + filename);

            while ((count = zis.read(buffer)) != -1) {
                fout.write(buffer, 0, count);
            }

            fout.close();
            zis.closeEntry();
        }

        zis.close();
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }

    return true;
}