java - 压缩子目录仅压缩子目录的内容而不压缩子目录

标签 java file zip

下面是我试过的代码。它仅压缩子文件夹的内容而不压缩文件夹 我需要将所有子文件夹连同内容一起压缩。我在这里做错了什么。 示例:我在 demo 文件夹中有一个文件夹“demo”,我有 a、b、c 文件夹。我想压缩 a、b、c 和内容,zip 不应包含演示的父级。

static void addDir(File dirObj, ZipOutputStream out) throws IOException {
        File[] files = dirObj.listFiles();
        byte[] tmpBuf = new byte[1024];

        for (int i = 0; i < files.length; i++) {
          if (files[i].isDirectory()) {
            addDir(files[i], out);
            continue;
          }
          FileInputStream in = new FileInputStream(files[i].getAbsolutePath());
          System.out.println(" Adding: " + files[i].getName());
          out.putNextEntry(new ZipEntry(files[i].getName()));
          int len;
          while ((len = in.read(tmpBuf)) > 0) {
            out.write(tmpBuf, 0, len);
          }
          out.closeEntry();
          in.close();
        }
      }

    public static void zipFiles(File[] subd) {

        String zipFile = "test.zip";

        try {

            FileOutputStream fos = new FileOutputStream(zipFile);

            ZipOutputStream zos = new ZipOutputStream(fos);

            for (File dir : subd) {

                addDir(dir, zos);

            }

            // close the ZipOutputStream
            zos.close();

        } catch (IOException ioe) {
            System.out.println("Error creating zip file: " + ioe);
        }

最佳答案

这是我为 zip 文件和有层次结构和没有层次结构的目录所做的代码。 zip.getHierarchy().equals("F") 部分完成您想要完成的工作。 在此代码中,您必须将源文件、目标、层次结构 (T/F) 作为参数传递。 此外,您可能需要一个 DTO 类。

public static void Start() throws IOException{ 

    FileOutputStream fos = new FileOutputStream(zip.getDestination());
    ZipOutputStream zipOut = new ZipOutputStream(fos);
    File fileToZip = new File(zip.getSourcePath());

        zipDirectory(fileToZip, fileToZip.getName(), zipOut);

    zipOut.close();
    fos.close();
}

public static void zipDirectory(File fileToZip, String fileName, ZipOutputStream zipOut) throws IOException {

    if (fileToZip.isDirectory()) {

        File[] children = fileToZip.listFiles();

        for (File childFile : children) {
            if(zip.getHierarchy().equals("T")) {
                zipDirectory(childFile, childFile.getPath(), zipOut);
            }else if(zip.getHierarchy().equals("F")){
                zipDirectory(childFile, childFile.getName(), zipOut);
            }
        }
        return; 
    }
    doZip(fileToZip,fileName,zipOut);
}

public static void doZip(File fileToZip,String fileName,ZipOutputStream zipOut) throws IOException {
    FileInputStream fis = new FileInputStream(fileToZip);
    ZipEntry zipEntry = new ZipEntry(fileName);
    zipOut.putNextEntry(zipEntry);
    byte[] bytes = new byte[1024];
    int length;
    while ((length = fis.read(bytes)) >= 0) {
        zipOut.write(bytes, 0, length);
    }
    fis.close();
}

关于java - 压缩子目录仅压缩子目录的内容而不压缩子目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56981140/

相关文章:

java - 无法无异常地修改私有(private)最终静态变量

ios - iOS SDK部分文件读写

java - 使用连接的字符串调用方法

java - 为什么格式化日期时有些日期显示为 BST,有些日期显示为 GMT?

java - 动画构造函数在 Java GUI 中不起作用

Linux:用一个异常文件删除所有早于某个日期的文件

java - 在java中打开文件无法正常工作

php - 在 laravel artisan 中从命令行下载文件

Python 内存 zip 库

objective-c - 如何(高度)压缩文件并在 iOS 上解压缩