IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Dé-zipping un fichier retourne une erreur


Sujet :

Entrée/Sortie Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Points : 149
    Points
    149
    Par défaut Dé-zipping un fichier retourne une erreur
    Bonjour,

    J'utilise le programme ci_dessous pour dé-zipper un fichier (cela marche très bien avec des logiciels tels que WinRar ou Unzip).

    En fait il s'agit d'un code que j'ai trouvé sur le Net. J'obtiens le message "MAL FORMED".
    J'ai essayé avec d'autres codes que j'ai également trouvés et j'obtiens des erreurs différentes "File too large" par exemple.

    En fait il s'agit d'un fichier zippé (Bataille.zip, que je joins également) relativement petit : 76K, incluant 16 fichiers, chacun d'eux ne dépassant pas 37K.

    Dans mon code vous trouverez des traces (messages à la console) pour savoir sur quelle instruction il se plantait, il s'agit de entry = zipIn.getNextEntry(); .

    Avez-vous des suggestions à me faire, ou un exemple qui pourrait fonctionner correctement.

    Pour Info: je développe sous Windows 8.1 avec Eclipse en mode 64 bits.

    Merci d'avance.

    Gégé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.List;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipInputStream;
     
     
    public class UnzipFile
    {
        List<String> fileList;
     
        static final int BUFFER = 512;
        static final int TOOBIG = 0x6400000; // Max size of unzipped data, 100MB
        static final int TOOMANY = 1024;     // Max number of files
        // ...    
        private static final 	String 	outputFolder = 	System.getProperties().getProperty("user.dir")  ;
        public static   		String  zipFile = "";
        private static final int BUFFER_SIZE = 64096; // j'ai essayé avec 32K  et moins.
     
      public UnzipFile(String fichier) throws Exception
      {
    	  super();
    	  zipFile = fichier;
    	 unzip(zipFile, outputFolder);
      }	  
     
     
    	public void unzip (String zipFilePath, String destDirectory)  
    	{
     		try
       	  	{
                File destDir = new File(destDirectory);
                if (!destDir.exists()) {
                    destDir.mkdir();
                }
                System.out.println("1" );
                ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFilePath));
                System.out.println("2" );
                ZipEntry entry = zipIn.getNextEntry();
                System.out.println("3" );
                // iterates over entries in the zip file
                while (entry != null) {
                	System.out.println(entry.getName() );
                    String filePath = destDirectory + File.separator + entry.getName();
                    if (!entry.isDirectory()) {
                        // if the entry is a file, extracts it
                    	  System.out.println("4" );
                        extractFile(zipIn, filePath);
                        System.out.println("5" );
                    } else {
                        // if the entry is a directory, make the directory
                        File dir = new File(filePath);
                        dir.mkdir();
                    }
                    System.out.println("6" );
                    zipIn.closeEntry();
                    System.out.println("7" );
                    entry = zipIn.getNextEntry();
                    System.out.println("8" );
                }
                zipIn.close();
       	  	} 
     		catch (Exception ex){System.out.println(ex.toString());}
    	}
     
            private void extractFile(ZipInputStream zipIn, String filePath) throws IOException {
                BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath));
                byte[] bytesIn = new byte[BUFFER_SIZE];
                int read = 0;
                while ((read = zipIn.read(bytesIn)) != -1) {
                    bos.write(bytesIn, 0, read);
                }
                bos.close();
            }
     
    public static void main( String[] args ) throws Exception
    {
    	  new UnzipFile("F:\\Test\\Bataille.zip");
     
    }
    }
    Fichiers attachés Fichiers attachés

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Le problème vient de l'encodage.
    avec new ZipInputStream(new FileInputStream(zipFilePath),Charset.forName("CP437")); ça fonctionnera (bien sûr, il faudrait prévoir de plutôt passer l'encodage en paramètre)

    Sinon, ce code n'est pas terrible :
    • Les fermetures de flux sont mal gérées
    • La problématique des dossiers est mal gérée (prévoir des mkdirs, à la place des mkdir, et dans extractFile aussi, les dossiers extraits n'existant pas forcément)*
    • C'est quoi cette structure avec un constructeur et le nom en variable et le dossier de destination en statique, et une méthode non statique avec le nom et le dossier de destination en paramètre en paramètres ? Si on veut dezipper vers un dossier particlier, il faut d'abord dezipper vers user.dir
    • et j'en passe

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Points : 149
    Points
    149
    Par défaut
    Merci Joel pour ta réponse rapide. En spécifiant Charset ça marche de façon impeccable.

    Pour ce qui est du code, comme je l'expliquais je n'en suis pas l'auteur, j'ai fait simplement un copier/coller avec de légères modifications, il n'est pour l'instant qu'un programme exemple de faisabilité, et je suivrai tes conseils pour rendre le code "plus propre" lorsque je développerai la classe qui sera en exploitation.

    Merci encore

    Gégé

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Oui, j'avais bien compris que c'était un code récupéré sur le web. On peut d'ailleurs largement le simplifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    public static void unzip(String path, String targetPath, String charsetName) throws IOException {
     
    		unzip(Paths.get(path),
    				Paths.get(targetPath),
    				charsetName==null?StandardCharsets.UTF_8:Charset.forName(charsetName));
     
    	}
     
    	public static void unzip(Path path, Path targetPath, Charset charset) throws IOException {
     
    		if ( !Files.isRegularFile(path) ) {
    			throw new FileNotFoundException("Zip file not found");
    		}
     
    		if ( Files.isRegularFile(targetPath) ) {
    			throw new IOException("Target path is an existing file");
    		}  
     
    		try(ZipInputStream zipInputStream = new ZipInputStream(Files.newInputStream(path),charset)) {
    			for(ZipEntry zipEntry = zipInputStream.getNextEntry(); zipEntry!=null; zipEntry = zipInputStream.getNextEntry()) {
    				Path filePath = targetPath.resolve(zipEntry.getName());
    				if ( zipEntry.isDirectory() ) {
    					Files.createDirectories(filePath);
    				}
    				else {
    					Files.createDirectories(filePath.getParent());
    					Files.copy(zipInputStream, filePath, StandardCopyOption.REPLACE_EXISTING);
    				}
    			}
    		}
     
    	}

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Points : 149
    Points
    149
    Par défaut
    OK merci. Je vais prendre ton code.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. shell retourne une erreur
    Par nymus7 dans le forum Langage
    Réponses: 3
    Dernier message: 07/08/2008, 18h03
  2. [MySQL] requete qui retourne une erreur a l'execution
    Par naazih dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 18/05/2008, 12h59
  3. Requete SQL qui retourne une erreur
    Par gregal dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/03/2008, 23h05
  4. Réponses: 8
    Dernier message: 05/02/2008, 11h35
  5. [MSSQL 2005] Retourner une erreure dans une SP
    Par Danny Blue dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 01/08/2006, 08h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo