Ajouter un commentaire

thesuixx

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

Filtered HTML

Plain text

CAPTCHA
Cette question permet de vérifier que vous n'êtes pas un robot spammeur :-)
  CCC  V     V   QQQ    Y   Y  FFFF 
C V V Q Q Y Y F
C V V Q Q Y FFF
C V V Q QQ Y F
CCC V QQQQ Y F
Q