@@ -21,68 +21,77 @@ public class DirectZipWriter implements ZipWriter {
2121 @ Override
2222 public void write (@ Nonnull ZipArchive archive , @ Nonnull OutputStream os ) throws IOException {
2323 // Write local file headers.
24- for (final LocalFileHeader fileHeader : archive .getLocalFiles ()) {
25- writeIntLE (os , ZipPatterns .LOCAL_FILE_HEADER_QUAD );
26- writeShortLE (os , fileHeader .getVersionNeededToExtract ());
27- writeShortLE (os , fileHeader .getGeneralPurposeBitFlag ());
28- writeShortLE (os , fileHeader .getCompressionMethod ());
29- writeShortLE (os , fileHeader .getLastModFileTime ());
30- writeShortLE (os , fileHeader .getLastModFileDate ());
31- writeIntLE (os , fileHeader .getCrc32 ());
32- writeIntLE (os , (int ) fileHeader .getCompressedSize ());
33- writeIntLE (os , (int ) fileHeader .getUncompressedSize ());
34- writeShortLE (os , fileHeader .getFileNameLength ());
35- writeShortLE (os , fileHeader .getExtraFieldLength ());
36- os .write (MemorySegmentUtil .toByteArray (fileHeader .getFileName ()));
37- os .write (MemorySegmentUtil .toByteArray (fileHeader .getExtraField ()));
38- os .write (MemorySegmentUtil .toByteArray (fileHeader .getFileData ()));
39- }
24+ for (final LocalFileHeader fileHeader : archive .getLocalFiles ())
25+ writeLocalFile (fileHeader , os );
4026
4127 // Write central directory file headers.
42- for (final CentralDirectoryFileHeader directory : archive .getCentralDirectories ()) {
43- writeIntLE (os , ZipPatterns .CENTRAL_DIRECTORY_FILE_HEADER_QUAD );
44- writeShortLE (os , directory .getVersionMadeBy ());
45- writeShortLE (os , directory .getVersionNeededToExtract ());
46- writeShortLE (os , directory .getGeneralPurposeBitFlag ());
47- writeShortLE (os , directory .getCompressionMethod ());
48- writeShortLE (os , directory .getLastModFileTime ());
49- writeShortLE (os , directory .getLastModFileDate ());
50- writeIntLE (os , directory .getCrc32 ());
51- writeIntLE (os , (int ) directory .getCompressedSize ());
52- writeIntLE (os , (int ) directory .getUncompressedSize ());
53- writeShortLE (os , directory .getFileNameLength ());
54- writeShortLE (os , directory .getExtraFieldLength ());
55- writeShortLE (os , directory .getFileCommentLength ());
56- writeShortLE (os , directory .getDiskNumberStart ());
57- writeShortLE (os , directory .getInternalFileAttributes ());
58- writeIntLE (os , directory .getExternalFileAttributes ());
59- writeIntLE (os , (int ) directory .getRelativeOffsetOfLocalHeader ());
60- os .write (MemorySegmentUtil .toByteArray (directory .getFileName ()));
61- os .write (MemorySegmentUtil .toByteArray (directory .getExtraField ()));
62- os .write (MemorySegmentUtil .toByteArray (directory .getFileComment ()));
63- }
28+ for (final CentralDirectoryFileHeader directory : archive .getCentralDirectories ())
29+ writeCentralDirectory (directory , os );
6430
6531 // Write end of central directory record.
6632 final EndOfCentralDirectory end = archive .getEnd ();
67- if (end != null ) {
68- writeIntLE (os , ZipPatterns .END_OF_CENTRAL_DIRECTORY_QUAD );
69- writeShortLE (os , end .getDiskNumber ());
70- writeShortLE (os , end .getCentralDirectoryStartDisk ());
71- writeShortLE (os , end .getCentralDirectoryStartOffset ());
72- writeShortLE (os , end .getNumEntries ());
73- writeIntLE (os , (int ) end .getCentralDirectorySize ());
74- writeIntLE (os , (int ) end .getCentralDirectoryOffset ());
75- writeShortLE (os , end .getZipCommentLength ());
76- os .write (MemorySegmentUtil .toByteArray (end .getZipComment ()));
77- }
33+ if (end != null )
34+ writeEnd (end , os );
7835 }
7936
80- private static void writeShortLE (OutputStream os , int value ) throws IOException {
37+ protected void writeLocalFile (@ Nonnull LocalFileHeader fileHeader , @ Nonnull OutputStream os ) throws IOException {
38+ writeIntLE (os , ZipPatterns .LOCAL_FILE_HEADER_QUAD );
39+ writeShortLE (os , fileHeader .getVersionNeededToExtract ());
40+ writeShortLE (os , fileHeader .getGeneralPurposeBitFlag ());
41+ writeShortLE (os , fileHeader .getCompressionMethod ());
42+ writeShortLE (os , fileHeader .getLastModFileTime ());
43+ writeShortLE (os , fileHeader .getLastModFileDate ());
44+ writeIntLE (os , fileHeader .getCrc32 ());
45+ writeIntLE (os , (int ) fileHeader .getCompressedSize ());
46+ writeIntLE (os , (int ) fileHeader .getUncompressedSize ());
47+ writeShortLE (os , fileHeader .getFileNameLength ());
48+ writeShortLE (os , fileHeader .getExtraFieldLength ());
49+ os .write (MemorySegmentUtil .toByteArray (fileHeader .getFileName ()));
50+ os .write (MemorySegmentUtil .toByteArray (fileHeader .getExtraField ()));
51+ os .write (MemorySegmentUtil .toByteArray (fileHeader .getFileData ()));
52+ }
53+
54+ protected void writeCentralDirectory (@ Nonnull CentralDirectoryFileHeader directory , @ Nonnull OutputStream os ) throws IOException {
55+ writeIntLE (os , ZipPatterns .CENTRAL_DIRECTORY_FILE_HEADER_QUAD );
56+ writeShortLE (os , directory .getVersionMadeBy ());
57+ writeShortLE (os , directory .getVersionNeededToExtract ());
58+ writeShortLE (os , directory .getGeneralPurposeBitFlag ());
59+ writeShortLE (os , directory .getCompressionMethod ());
60+ writeShortLE (os , directory .getLastModFileTime ());
61+ writeShortLE (os , directory .getLastModFileDate ());
62+ writeIntLE (os , directory .getCrc32 ());
63+ writeIntLE (os , (int ) directory .getCompressedSize ());
64+ writeIntLE (os , (int ) directory .getUncompressedSize ());
65+ writeShortLE (os , directory .getFileNameLength ());
66+ writeShortLE (os , directory .getExtraFieldLength ());
67+ writeShortLE (os , directory .getFileCommentLength ());
68+ writeShortLE (os , directory .getDiskNumberStart ());
69+ writeShortLE (os , directory .getInternalFileAttributes ());
70+ writeIntLE (os , directory .getExternalFileAttributes ());
71+ writeIntLE (os , (int ) directory .getRelativeOffsetOfLocalHeader ());
72+ os .write (MemorySegmentUtil .toByteArray (directory .getFileName ()));
73+ os .write (MemorySegmentUtil .toByteArray (directory .getExtraField ()));
74+ os .write (MemorySegmentUtil .toByteArray (directory .getFileComment ()));
75+ }
76+
77+ protected void writeEnd (@ Nonnull EndOfCentralDirectory end , @ Nonnull OutputStream os ) throws IOException {
78+ writeIntLE (os , ZipPatterns .END_OF_CENTRAL_DIRECTORY_QUAD );
79+ writeShortLE (os , end .getDiskNumber ());
80+ writeShortLE (os , end .getCentralDirectoryStartDisk ());
81+ writeShortLE (os , end .getCentralDirectoryStartOffset ());
82+ writeShortLE (os , end .getNumEntries ());
83+ writeIntLE (os , (int ) end .getCentralDirectorySize ());
84+ writeIntLE (os , (int ) end .getCentralDirectoryOffset ());
85+ writeShortLE (os , end .getZipCommentLength ());
86+ os .write (MemorySegmentUtil .toByteArray (end .getZipComment ()));
87+ }
88+
89+ protected static void writeShortLE (OutputStream os , int value ) throws IOException {
8190 os .write (value & 0xFF );
8291 os .write ((value >> 8 ) & 0xFF );
8392 }
8493
85- private static void writeIntLE (OutputStream os , int value ) throws IOException {
94+ protected static void writeIntLE (OutputStream os , int value ) throws IOException {
8695 os .write (value & 0xFF );
8796 os .write ((value >> 8 ) & 0xFF );
8897 os .write ((value >> 16 ) & 0xFF );
0 commit comments