in src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java [922:968]
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;
final int method = current.entry.getMethod();
if (method == ZipArchiveOutputStream.STORED) {
read = readStored(buffer, offset, length);
} else if (method == ZipArchiveOutputStream.DEFLATED) {
read = readDeflated(buffer, offset, length);
} else if (method == ZipMethod.UNSHRINKING.getCode() || method == ZipMethod.IMPLODING.getCode()
|| method == ZipMethod.ENHANCED_DEFLATED.getCode() || method == ZipMethod.BZIP2.getCode()
|| ZipMethod.isZstd(method)
|| method == ZipMethod.XZ.getCode()) {
read = current.inputStream.read(buffer, offset, length);
} else {
throw new UnsupportedZipFeatureException(ZipMethod.getMethodByCode(method), current.entry);
}
if (read >= 0) {
current.crc.update(buffer, offset, read);
uncompressedCount += read;
}
return read;
}