首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ZipOutputStream不为目录创建新条目。

ZipOutputStream不为目录创建新条目。
EN

Stack Overflow用户
提问于 2022-04-19 14:11:39
回答 1查看 113关注 0票数 0

我试图在.zip文件中创建目录,但在.zip中只创建了一个目录。我不知道为什么只创建第一个目录。每次有目录时,zip()方法都会被调用。

方法来列出文件:

代码语言:javascript
复制
private Set<String> listFiles(String path){

        File f = new File(path);
        Set<String> files = new HashSet<>();

        for(File file : Objects.requireNonNull(f.listFiles())){
            files.add(file.getPath());
        }
        return files;
    }

方法来压缩:

代码语言:javascript
复制
 private void zip(Set<String> path){
        try {
            BufferedInputStream bufferedInputStream = null;
            BufferedOutputStream bufferedOutputStream;
            ZipOutputStream zipOutputStream;

            File f;

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {

                bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("/sdcard/Android/data/com.kpwnapps.pmmpplugins/files/PocketMine-MP/test.zip"));
                zipOutputStream= new ZipOutputStream(bufferedOutputStream, StandardCharsets.UTF_8);

                for (String file : path){

                    f = new File(file);

                    if (f.isDirectory()){
                        zipOutputStream.putNextEntry(new ZipEntry(f.getName() + "/"));
                        zip(listFiles(f.getPath()));
                    }else {
                      
                        bufferedInputStream = new BufferedInputStream(new FileInputStream(file));
                        zipOutputStream.putNextEntry(new ZipEntry(f.getName()));
                        IOUtils.copy(bufferedInputStream, zipOutputStream);
                        zipOutputStream.closeEntry();
                    }
                     */

                }

                if (bufferedInputStream != null){
                    bufferedInputStream.close();
                }

                zipOutputStream.flush();
                zipOutputStream.close();

            }
        }catch (Exception ignored){
        }

    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-19 15:05:58

我有点惊讶,这居然管用。

当您的zip()方法递归地调用自己时,它将创建一个与上一次调用具有相同文件名的新FileOutputStream。这意味着您的递归调用将在彼此之上写入,而不是附加到单个zip文件中。

您应该只打开FileOutputStream / ZipOutputStream一次,然后使用它来压缩所有文件和目录。

这意味着重写一些代码,以便在第一级压缩时创建zipOutputStream,然后调用内部方法zip(path, zipOutputStream)。递归调用还必须调用此zip(path, zipOutputStream)方法。

这看起来就像

代码语言:javascript
复制
private void zip(Set<String> path) {
    // create FileOutputStream, ZipOutputStream
    ZipOutputStream zipOutputStream = new ZipOutputStream(fileOutputStream);
    // call worker method
    zip(path, zipOutputStream);
    // close output stream
    zipOutputStream.flush();
    zipOutputStream.close();
}

private void zip(Set<String> path, ZipOutputStream zipOutputStream) {
    // loop over paths
        if (f.isDirectory()) {
            zipOutputStream.putNextEntry(new ZipEntry(f.getName() + "/"));
            zip(listFiles(f.getPath()), zipOutputStream);
        }
    // end of loop over paths
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71926406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档