为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Java 中压缩包含所有子文件夹的完整目录?

如何在 Java 中压缩包含所有子文件夹的完整目录?

临摹微笑 2023-08-09 15:02:49
嘿嘿!在你去报告这个重复之前:我研究了几个小时,是的,有很多关于这方面的网站、问题和视频,但这些都不能帮助我。我已经使用了不同的技术来创建 zip 存档,效果很好。我还可以毫无问题地从子目录中获取所有文件。但问题是我只得到列出的所有文件,没有它们的目录。如果我有/something/somethingelse/text1.txt 和 /something/somethingother/lol.txt我希望它完全像那样显示在 zip 文件夹中。在 zip 文件夹中应该有 2 个文件夹 someelse 和 someother,其中包含它们的文件。对于我找到的所有版本,它将所有文件和其他子文件夹中的所有文件直接放入 zip 中,因此当我单击它时,.zip它只显示text1.txt和lol.txt,没有任何文件夹。有没有一种方法可以.zip像所有众所周知的压缩文件程序一样处理 a ?我只想压缩目录并保留以前的所有内容,只是打包到 zip 存档中。我用我的java水平尝试了一切,也尝试了一些在线版本,没有任何结果能达到我想要的结果。
查看完整描述

2 回答

?
波斯汪

TA贡献1811条经验 获得超4个赞

干得好:


private static void zipFolder(Path sourceFolderPath, Path zipPath) throws Exception {

   ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipPath.toFile()));

   Files.walkFileTree(sourceFolderPath, new SimpleFileVisitor<Path>() {

       public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {

           zos.putNextEntry(new ZipEntry(sourceFolderPath.relativize(file).toString()));

           Files.copy(file, zos);

           zos.closeEntry();

           return FileVisitResult.CONTINUE;

        }

    });

    zos.close();

 }

./

https://img1.sycdn.imooc.com//64d33a450001b84c10740112.jpg

./somethigelse/

https://img1.sycdn.imooc.com//64d33a570001862610780080.jpg

./其他东西/

https://img1.sycdn.imooc.com//64d33a680001fe5110790077.jpg


查看完整回答
反对 回复 2023-08-09
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

该解决方案保留了创建的 zip 文件内的文件夹结构的层次结构 -


import java.io.*;

import java.util.zip.ZipEntry;

import java.util.zip.ZipOutputStream;


public class ZipDirectories {


    public static void main(String[] args) throws IOException {

        zipDirectory(args[0], args[1]);

    }


    private static void zipDirectory(String zipFileName, String rootDirectoryPath) throws IOException {

        File directoryObject = new File(rootDirectoryPath);

        if (!zipFileName.endsWith(".zip")) {

            zipFileName = zipFileName + ".zip";

        }

        ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName));

        System.out.println("Creating : " + zipFileName);

        addDirectory(directoryObject, out);

        out.close();

    }


    private static void addDirectory(File directoryObject, ZipOutputStream out) throws IOException {

        File[] files = directoryObject.listFiles();

        byte[] tmpBuf = new byte[1024];


        for (File file : files) {

            if (file.isDirectory()) {

                addDirectory(file, out);

                continue;

            }

            FileInputStream in = new FileInputStream(file.getAbsolutePath());

            System.out.println(" Adding: " + file.getAbsolutePath());

            out.putNextEntry(new ZipEntry(file.getAbsolutePath()));

            int len;

            while ((len = in.read(tmpBuf)) > 0) {

                out.write(tmpBuf, 0, len);

            }

            out.closeEntry();

            in.close();

        }

    }

}


查看完整回答
反对 回复 2023-08-09
  • 2 回答
  • 0 关注
  • 178 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信