40 private static final int [] commentLengths
41 = { 0, 1, 32768, commentMaxLength - 1, commentMaxLength };
42
43 public static void main(String argv[])
44 throws Exception
45 {
46 for (int i = 0; i < commentLengths.length; ++i) {
47 int commentLength = commentLengths[i];
48 String comment = buildComment(commentLength);
49 String name = "Test" + commentLength + ".zip";
50 writeZipFile(name, comment);
51 verifyZipFile(name, comment);
52 new File(name).delete();
53 System.out.println(commentLength + ": successful");
54 }
55 }
56
57 private static void writeZipFile(String name, String comment)
58 throws IOException
59 {
60 ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(name));
61 try {
62 zos.setComment(comment);
63 ZipEntry ze = new ZipEntry(entryName);
64 ze.setMethod(ZipEntry.DEFLATED);
65 zos.putNextEntry(ze);
66 new DataOutputStream(zos).writeUTF(entryContents);
67 zos.closeEntry();
68 } finally {
69 zos.close();
70 }
71 }
72
73 private static void verifyZipFile(String name, String comment)
74 throws Exception
75 {
76 // Check that Zip entry was correctly written.
77 ZipFile zipFile = new ZipFile(name);
78 ZipEntry zipEntry = zipFile.getEntry(entryName);
79 InputStream is = zipFile.getInputStream(zipEntry);
80 String result = new DataInputStream(is).readUTF();
81 if (!result.equals(entryContents))
82 throw new Exception("Entry contents corrupted");
83
84 // Check that comment length was correctly written.
85 RandomAccessFile file = new RandomAccessFile(name, "r");
86 file.seek(file.length() - comment.length()
87 - ZipFile.ENDHDR + ZipFile.ENDCOM);
88 int b1 = file.readUnsignedByte();
89 int b2 = file.readUnsignedByte();
90 if (b1 + (b2 << 8) != comment.length())
91 throw new Exception("Zip file comment length corrupted");
92
93 // Check that comment was correctly written.
94 file.seek(file.length() - comment.length());
95 byte [] bytes = new byte [comment.length()];
96 file.readFully(bytes);
97 zipFile.close();
98 file.close();
99 if (! comment.equals(new String(bytes, "UTF8")))
100 throw new Exception("Zip file comment corrupted");
101 }
102
103 private static String buildComment(int length) {
104 StringBuffer result = new StringBuffer();
105 while (result.length() < length) {
106 /* Endhdr is 22 bytes long, so this pattern makes it easy
107 * to see if it is copied correctly */
108 result.append("abcdefghijklmnopqrstuvABCDEFGHIJKLMNOPQRSTUV");
109 }
110 String string = result.toString();
111 string = string.substring(string.length() - length);
112 return string;
113 }
114 }
|
40 private static final int [] commentLengths
41 = { 0, 1, 32768, commentMaxLength - 1, commentMaxLength };
42
43 public static void main(String argv[])
44 throws Exception
45 {
46 for (int i = 0; i < commentLengths.length; ++i) {
47 int commentLength = commentLengths[i];
48 String comment = buildComment(commentLength);
49 String name = "Test" + commentLength + ".zip";
50 writeZipFile(name, comment);
51 verifyZipFile(name, comment);
52 new File(name).delete();
53 System.out.println(commentLength + ": successful");
54 }
55 }
56
57 private static void writeZipFile(String name, String comment)
58 throws IOException
59 {
60 try (FileOutputStream fos = new FileOutputStream(name);
61 ZipOutputStream zos = new ZipOutputStream(fos))
62 {
63 zos.setComment(comment);
64 ZipEntry ze = new ZipEntry(entryName);
65 ze.setMethod(ZipEntry.DEFLATED);
66 zos.putNextEntry(ze);
67 new DataOutputStream(zos).writeUTF(entryContents);
68 zos.closeEntry();
69 }
70 }
71
72 private static void verifyZipFile(String name, String comment)
73 throws Exception
74 {
75 // Check that Zip entry was correctly written.
76 try (ZipFile zipFile = new ZipFile(name)) {
77 ZipEntry zipEntry = zipFile.getEntry(entryName);
78 InputStream is = zipFile.getInputStream(zipEntry);
79 String result = new DataInputStream(is).readUTF();
80 if (!result.equals(entryContents))
81 throw new Exception("Entry contents corrupted");
82 }
83
84 try (RandomAccessFile file = new RandomAccessFile(name, "r")) {
85 // Check that comment length was correctly written.
86 file.seek(file.length() - comment.length()
87 - ZipFile.ENDHDR + ZipFile.ENDCOM);
88 int b1 = file.readUnsignedByte();
89 int b2 = file.readUnsignedByte();
90 if (b1 + (b2 << 8) != comment.length())
91 throw new Exception("Zip file comment length corrupted");
92
93 // Check that comment was correctly written.
94 file.seek(file.length() - comment.length());
95 byte [] bytes = new byte [comment.length()];
96 file.readFully(bytes);
97 if (! comment.equals(new String(bytes, "UTF8")))
98 throw new Exception("Zip file comment corrupted");
99 }
100 }
101
102 private static String buildComment(int length) {
103 StringBuffer result = new StringBuffer();
104 while (result.length() < length) {
105 /* Endhdr is 22 bytes long, so this pattern makes it easy
106 * to see if it is copied correctly */
107 result.append("abcdefghijklmnopqrstuvABCDEFGHIJKLMNOPQRSTUV");
108 }
109 String string = result.toString();
110 string = string.substring(string.length() - length);
111 return string;
112 }
113 }
|