j'ai trouvé une methode un peu maladroite de le faire, mais il y a comme un probleme, apparemment, le premier byte ecrit est -1 donc la methode read de Image IO s'arrete là
// Décompresse un fichier zip à l'adresse indiquée par le dossier
public static BufferedImage decompressBufferedImage(final File fichierADecompresser, String nomFichier)
throws IOException {
// le flux pour lire le zip
ZipInputStream zis = new ZipInputStream(new BufferedInputStream(
new FileInputStream(fichierADecompresser.getCanonicalFile())));
// un fichier du zip
ZipEntry ze;
// le compteur de bytes
int cptBytes = 0;
// on Parcourt tous les fichiers jusqu'à trouver le bon
while (null != (ze = zis.getNextEntry()) && !ze.getName().equals(nomFichier));
// si le bon a été trouvé
if (ze != null && ze.getName().equals(nomFichier)){
// on compte le nombre de bytes
final byte[] buf = new byte[8192];
//final byte[] buf = new byte[1];
int bytesRead;
while (-1 != (bytesRead = zis.read(buf))){
cptBytes+=bytesRead;
}
System.out.println("cptBytes = "+cptBytes);
// on recommence le desarchivage
zis = new ZipInputStream(new BufferedInputStream(
new FileInputStream(fichierADecompresser.getCanonicalFile())));
// Parcourt tous les fichiers jusqu'à trouver le bon
while (null != (ze = zis.getNextEntry()) && !ze.getName().equals(nomFichier)) ;
myInputStream mis = new myInputStream(cptBytes);
// on écrit dans le inputstream
while (-1 != (bytesRead = zis.read(buf))){
for (int i = 0; i<bytesRead; i++)
mis.write(buf[i]);
}
BufferedImage bufIma = ImageIO.read(mis);
return bufIma;
}
else return null;
}
class myInputStream extends InputStream{
private byte[] octets;
private int compteurRead, compteurWrite;
protected myInputStream(int nbBytes){
compteurRead = 0;
compteurWrite = 0;
octets = new byte[nbBytes];
}
/**
* @return le prochain byte de la liste
* @throws java.io.IOException
*/
@Override
public int read() throws IOException {
compteurRead++;
if (compteurRead-1 < octets.length)
return (int) octets[compteurRead-1];
else return -1;
}
/**
* ajoute le byte b à la liste de bytes
* @param b
*/
public void write (byte b){
if (compteurWrite<octets.length){
octets[compteurWrite] = b;
compteurWrite++;
}
}
}
La facon de compter les bytes est un peu maladroite mais j'ai pas trouvé mieux
Mais ca marche toujours pas :S
j'ai trouvé une methode un peu maladroite de le faire, mais il y a comme un probleme, apparemment, le premier byte ecrit est -1 donc la methode read de Image IO s'arrete là
La facon de compter les bytes est un peu maladroite mais j'ai pas trouvé mieux
Mais ca marche toujours pas :S