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
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