Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8277984

ZIP files created by FileSystems.newFileSystem are larger than ZipOutputStream

XMLWordPrintable

    • generic
    • generic

      ADDITIONAL SYSTEM INFORMATION :
      Windows 10. Tested on
      java -version
      openjdk version "18-internal" 2022-03-15
      OpenJDK Runtime Environment (build 18-internal+0-adhoc.dg.panama-foreign)
      OpenJDK 64-Bit Server VM (build 18-internal+0-adhoc.dg.panama-foreign, mixed mode, sharing)
      java -version
      openjdk version "17" 2021-09-14
      OpenJDK Runtime Environment (build 17+35-2724)
      OpenJDK 64-Bit Server VM (build 17+35-2724, mixed mode, sharing)


      A DESCRIPTION OF THE PROBLEM :
      ZIP files created by FileSystems.newFileSystem are larger than zip files containing the same contents ZipOutputStream. When viewed in 7z Manager there is a difference in the storage method used for directory entries.

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      This test program below creates 2 zip files with DEFLATE storage for directory+file.
      The "ls" method prints the entries:
      dir/ method=8
      and
      dir/ method=0


      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      Directory entries "method" is method=8 (DEFLATED) for ZipOutputStream and method=0 (STORE) for FileSystems.newFileSystem.
      Perhaps as a consequence the ZIP files created by FileSystems.newFileSystem are always larger in size.

      ACTUAL -
      Test program prints:
      Write ZipOutputStream.zip
      Write newFileSystem.zip env={create=true, compressionMethod=DEFLATED}

      Files.size(ZipOutputStream.zip) => 284
      dir/ method=8
      dir/DifferentZipSize.txt size=18 method=8

      Files.size(newFileSystem.zip) => 410
      dir/ method=0
      dir/DifferentZipSize.txt size=18 method=8


      ---------- BEGIN SOURCE ----------
      import java.io.IOException;
      import java.nio.file.FileSystem;
      import java.nio.file.FileSystems;
      import java.nio.file.Files;
      import java.nio.file.Path;
      import java.util.Map;
      import java.util.zip.ZipEntry;
      import java.util.zip.ZipFile;
      import java.util.zip.ZipOutputStream;
      public class DifferentZipSize
      {
          public static void main(String[] args) throws IOException
          {
              Path zos = Path.of("ZipOutputStream.zip");
              Path nfs = Path.of("newFileSystem.zip");

              Files.deleteIfExists(zos);
              Files.deleteIfExists(nfs);

              String str = "Hello dir/file.txt";
              String dirName = "dir/";
              String fileName = dirName+"DifferentZipSize.txt";

              System.out.println("Write "+zos);
              try (ZipOutputStream zout = new ZipOutputStream(Files.newOutputStream(zos))) {
                  zout.putNextEntry(new ZipEntry(dirName));
                  zout.putNextEntry(new ZipEntry(fileName));
                  zout.write(str.getBytes());
              }

              Map<String, String> env = Map.of(
                      "create", "true"
                      // Also tried:
                      ,"compressionMethod", "DEFLATED"
              );
              System.out.println("Write "+nfs+" env="+env);
              try (FileSystem fs = FileSystems.newFileSystem(nfs, env)) {
                  Path root = fs.getPath("/");
                  Files.createDirectories(root.resolve(dirName));
                  Files.writeString(root.resolve(fileName), str);
              }

              ls(zos);
              ls(nfs);
          }

          private static void ls(Path zip) throws IOException
          {
              System.out.println();
              System.out.println("Files.size("+zip+") => "+Files.size(zip));
              try (ZipFile fs = new ZipFile(zip.toFile())) {
                  fs.stream()
                    .map(entry -> entry.getName()+(entry.isDirectory() ? "" : " size="+entry.getSize())+" method="+(entry.getMethod()))
                    .forEach(System.out::println);
              }
          }
      }

      ---------- END SOURCE ----------

      FREQUENCY : always


            lancea Lance Andersen
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: