added utilities for creating zip files
This commit is contained in:
@@ -14,9 +14,13 @@ import java.security.cert.X509Certificate;
|
|||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
import java.util.function.Supplier;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
import java.util.stream.StreamSupport;
|
import java.util.stream.StreamSupport;
|
||||||
|
import java.util.zip.CRC32;
|
||||||
|
import java.util.zip.ZipEntry;
|
||||||
|
import java.util.zip.ZipOutputStream;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class JWO {
|
public class JWO {
|
||||||
@@ -393,4 +397,83 @@ public class JWO {
|
|||||||
return null;
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user