@@ -21,68 +21,77 @@ public class DirectZipWriter implements ZipWriter {
21
21
@ Override
22
22
public void write (@ Nonnull ZipArchive archive , @ Nonnull OutputStream os ) throws IOException {
23
23
// 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 );
40
26
41
27
// 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 );
64
30
65
31
// Write end of central directory record.
66
32
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 );
78
35
}
79
36
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 {
81
90
os .write (value & 0xFF );
82
91
os .write ((value >> 8 ) & 0xFF );
83
92
}
84
93
85
- private static void writeIntLE (OutputStream os , int value ) throws IOException {
94
+ protected static void writeIntLE (OutputStream os , int value ) throws IOException {
86
95
os .write (value & 0xFF );
87
96
os .write ((value >> 8 ) & 0xFF );
88
97
os .write ((value >> 16 ) & 0xFF );
0 commit comments