added utilities for creating zip files

This commit is contained in:
2020-11-22 09:35:33 +01:00
parent 5ddb9e6cbf
commit 45489e8ed4

View File

@@ -14,9 +14,13 @@ import java.security.cert.X509Certificate;
import java.util.*;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.regex.Pattern;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
import java.util.zip.CRC32;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
@Slf4j
public class JWO {
@@ -393,4 +397,83 @@ public class JWO {
return null;
}
}
@SneakyThrows
private static void computeSizeAndCrc32(
ZipEntry zipEntry,
InputStream inputStream,
byte[] buffer) {
CRC32 crc32 = new CRC32();
long sz = 0L;
while (true) {
int read = inputStream.read(buffer);
if (read < 0) break;
sz += read;
crc32.update(buffer, 0, read);
}
zipEntry.setSize(sz);
zipEntry.setCompressedSize(sz);
zipEntry.setCrc(crc32.getValue());
}
@SneakyThrows
public static void write2Stream(OutputStream os,
InputStream inputStream,
byte[] buffer) {
while (true) {
int read = inputStream.read(buffer);
if (read < 0) break;
os.write(buffer, 0, read);
}
}
public static void write2Stream(OutputStream os,
InputStream inputStream) {
write2Stream(os, inputStream, new byte[0x10000]);
}
@SneakyThrows
public void writeZipEntry(
ZipOutputStream zip,
Supplier<InputStream> source,
String destinationFileName,
int compressionMethod,
byte[] buffer) {
ZipEntry zipEntry = new ZipEntry(destinationFileName);
switch(compressionMethod) {
case ZipEntry.STORED:
// A stored ZipEntry requires computing the size and CRC32 in advance
try(InputStream is = source.get()) {
computeSizeAndCrc32(zipEntry, is, buffer);
}
break;
case ZipEntry.DEFLATED:
break;
default:
throw newThrowable(IllegalArgumentException.class,
"Unsupported zip entry compression method value: %s", compressionMethod);
}
zipEntry.setMethod(compressionMethod);
zip.putNextEntry(zipEntry);
try(InputStream is = source.get()) {
write2Stream(zip, is, buffer);
}
zip.closeEntry();
}
public void writeZipEntry(
ZipOutputStream zip,
Supplier<InputStream> source,
String destinationFileName,
int compressionMethod) {
writeZipEntry(zip, source, destinationFileName, compressionMethod, new byte[0x10000]);
}
public void writeZipEntry(
ZipOutputStream zip,
Supplier<InputStream> source,
String destinationFileName) {
writeZipEntry(zip, source, destinationFileName, ZipEntry.DEFLATED);
}
}