En fait, il n'y a aucun moyen de réinitialiser un ZipInputStream
comme prévu, car il ne supporte pas de remise à zéro/marqueurs etc. Mais vous peut utiliser un ByteArrayOutputStream
pour tamponner votre InputStream
comme byte[]
si vous écrivez une classe ressemblant à
private byte[] readStreamBuffer;
private InputStream readStream;
public ZipClass(InputStream readStream){
this.readStream = readStream;
}
et un openReadStream
-method comme ceci:
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);
}
Maintenant, vous êtes en mesure de lire une entrée et fermer ensuite. Si vous appelez openReadStream
il vous fournira une nouvelle ZipInputStream
, afin que vous puissiez lire sélectivement des entrées comme ceci:
public InputStream read(String entry){
ZipInputStream unzipStream = openReadStream();
try {
return readZipEntry(unzipStream, entryName);
}
finally {
unzipStream.close(); //This closes the zipinputstream
}
}
appelant la méthode 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();
}
}
Et vous obtiendrez une nouvelle InputStream. Vous pouvez maintenant lire plusieurs fois à partir de la même entrée.
'ZipInputStream' est une implémentation différente écrite en Java pur, ce n'est pas un _low-level_ de' ZipFile'. 'ZipFile' utilise JNI et ne peut pas gérer les fichiers non locaux. –