in src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java [984:1032]
public int read(final byte[] buffer, final int offset, final int length) throws IOException {
if (length == 0) {
return 0;
}
if (closed) {
throw new IOException("The stream is closed");
}
if (current == null) {
return -1;
}
// avoid int overflow, check null buffer
if (offset > buffer.length || length < 0 || offset < 0 || buffer.length - offset < length) {
throw new ArrayIndexOutOfBoundsException();
}
ZipUtil.checkRequestedFeatures(current.entry);
if (!supportsDataDescriptorFor(current.entry)) {
throw new UnsupportedZipFeatureException(UnsupportedZipFeatureException.Feature.DATA_DESCRIPTOR,
current.entry);
}
if (!supportsCompressedSizeFor(current.entry)) {
throw new UnsupportedZipFeatureException(UnsupportedZipFeatureException.Feature.UNKNOWN_COMPRESSED_SIZE,
current.entry);
}
final int read;
if (current.entry.getMethod() == ZipArchiveOutputStream.STORED) {
read = readStored(buffer, offset, length);
} else if (current.entry.getMethod() == ZipArchiveOutputStream.DEFLATED) {
read = readDeflated(buffer, offset, length);
} else if (current.entry.getMethod() == ZipMethod.UNSHRINKING.getCode()
|| current.entry.getMethod() == ZipMethod.IMPLODING.getCode()
|| current.entry.getMethod() == ZipMethod.ENHANCED_DEFLATED.getCode()
|| current.entry.getMethod() == ZipMethod.BZIP2.getCode()) {
read = current.inputStream.read(buffer, offset, length);
} else {
throw new UnsupportedZipFeatureException(ZipMethod.getMethodByCode(current.entry.getMethod()),
current.entry);
}
if (read >= 0) {
current.crc.update(buffer, offset, read);
uncompressedCount += read;
}
return read;
}