На самом деле нет способа сбросить ZipInputStream
, как вы ожидаете, потому что он не поддерживает сброс / маркеры и т. Д.
Но вы можете использовать ByteArrayOutputStream
для буферизации InputStream
как byte[]
поэтому вы пишете класс, похожий на
private byte[] readStreamBuffer;
private InputStream readStream;
public ZipClass(InputStream readStream){
this.readStream = readStream;
}
и openReadStream
-метод, подобный этому:
private ZipInputStream openReadStream(){
if (readStreamBuffer == null) {
//If there was no buffered data yet it will do some new
ByteArrayOutputStream readStreamBufferStream = new ByteArrayOutputStream();
try {
int read = 0;
byte[] buff = new byte[1024];
while ((read = zipFileInput.read(buff)) != -1) {
readStreamBufferStream.write(buff, 0, read);
}
readStreamBuffer = readStreamBufferStream.toByteArray();
}
finally {
readStreamBufferStream.flush();
readStreamBufferStream.close();
}
}
//Read from you new buffered stream data
readStream = new ByteArrayInputStream(readStreamBuffer);
//open new ZipInputStream
return new ZipInputStream(readStream);
}
Теперь вы можете прочитать запись и затем закрыть ее. Если вы позвоните по номеру openReadStream
, он предоставит вам новый ZipInputStream
, поэтому вы можете выборочно читать записи, подобные этой:
public InputStream read(String entry){
ZipInputStream unzipStream = openReadStream();
try {
return readZipEntry(unzipStream, entryName);
}
finally {
unzipStream.close(); //This closes the zipinputstream
}
}
вызов метода readZipEntry
private InputStream readZipEntry(ZipInputStream zis, String entry) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
// get the zipped file list entry
try {
ZipEntry ze = zis.getNextEntry();
while (ze != null) {
if (!ze.isDirectory() && ze.getName().equals(entry)) {
int len;
byte[] buffer = new byte[BUFFER];
while ((len = zis.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
break;
}
ze = zis.getNextEntry();
}
}
finally {
zis.closeEntry();
}
InputStream is = new ByteArrayInputStream(out.toByteArray());
return is;
}
finally {
out.close();
}
}
И вы получите новый InputStream. Теперь вы можете читать несколько раз с одного и того же входа.