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 :

ZipOutputStream et gros fichiers


Sujet :

Entrée/Sortie Java

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 149
    Points : 126
    Points
    126
    Par défaut ZipOutputStream et gros fichiers
    Bonjour,

    Mon problème est tout simple à expliquer: Mon programme compresse ou stocke des fichiers ou dossiers dans un fichier zip. Mais quand un le poids total des fichiers à compresser est supérieur à 2Go, l'archive ne se termine pas et donc elle est inutile. (Elle pèse cependant le poids qu'elle devrais une fois terminée)
    Je n'obtiens cependant pas d'erreur, même du type OutOfMemory (ce que je pensais être la cause mais en fait c'est surement la limite de la JVM)

    J'utilise Apache IO pour lister les fichiers.
    Voici mon code: (j'ai retiré les parties inutiles à la résolution du problème)

    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
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
     
    public class Compressor extends JFrame {
     
    	public static String choosenRate = "Nul";
    	public static String type;
    	public static String getName = "Dossier ou fichier compressé";
    	public static String zipPath;
    	public static String srcPath;
    	public static boolean srcModified = false;
    	public static boolean zipModified = false;
     
     
    	public void compressFile(String name , String zipFile , String srcDir , String rateEntry) {
     
    		File zip = new File(zipFile + "/" + name + ".zip");
     
    		try {
    			try {
    				zip.createNewFile();
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
     
    			byte[] buffer = new byte[8192];
     
       			File dir = new File(srcDir);
     
    			FileOutputStream fos = new FileOutputStream(zip);
     
    			ZipOutputStream zos = new ZipOutputStream(fos);
    			switch (rateEntry) {
    			case "Nul": 
    				zos.setLevel(ZipOutputStream.STORED);
    				break;
    			case "Faible":
    				zos.setLevel(3);
    				break;
    			case "Moyen":
    				zos.setLevel(6);
    				break;
    			case "Elevé":
    				zos.setLevel(9);
    				break;
    			}
     
    			try{
     
    				FileInputStream fis = new FileInputStream(srcDir);
    				int length;    						
     
        			System.out.println(srcDir);
     
       				zos.putNextEntry(new ZipEntry(dir.getName()));
     
    				while ((length = fis.read(buffer)) > 0) {
    					zos.write(buffer, 0, length);
    				}
     
    					zos.closeEntry();
     
    					fis.close();
     
    			} catch (FileNotFoundException e) {
    				e.printStackTrace();
    			}
     
     
    		zos.close();
     
    		} catch (IOException ioe) {
    			ioe.printStackTrace();
    		} catch (IllegalArgumentException iae) {    			
    			iae.printStackTrace();
    		}
    	}
     
     
    	public void zipProcess(String name , String zipFile , String srcDir , String rateEntry )  {
     
    			File zip = new File(zipFile + "/" + name + ".zip");
     
        		try {
     
    				try {
    					zip.createNewFile();
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
     
        			byte[] buffer = new byte[1024];
     
           			File dir = new File(srcDir);
     
        			List<File> filesList = (List<File>) FileUtils.listFilesAndDirs(dir, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);
        			File[] files = filesList.toArray(new File[filesList.size()]);
     
        			FileOutputStream fos = new FileOutputStream(zip);
     
        			ZipOutputStream zos = new ZipOutputStream(fos);
        			switch (rateEntry) {
        			case "Nul": 
        				zos.setLevel(ZipOutputStream.STORED);
        				break;
        			case "Faible":
        				zos.setLevel(3);
        				break;
        			case "Moyen":
        				zos.setLevel(6);
        				break;
        			case "Elevé":
        				zos.setLevel(9);
        				break;
        			}
     
     
        			for (int i = 0; i < files.length; i++) {
    				try{
     
    					if (files[i].isDirectory()) {
     
    					} else {
     
    					FileInputStream fis = new FileInputStream(files[i]);
    					int length;    						
     
     
    	    			String filePath = files[i].getAbsolutePath().substring(srcDir.length() + 1);
    	    			System.out.println(filePath);
     
    	   				zos.putNextEntry(new ZipEntry(filePath));
     
    					while ((length = fis.read(buffer)) > 0) {
    						zos.write(buffer, 0, length);
    					}
     
    						zos.closeEntry();
     
    						fis.close();
    				}
    				} catch (FileNotFoundException e) {
    					e.printStackTrace();
    				}
        			}
     
    			zos.close();
     
        		} catch (IOException ioe) {
        			ioe.printStackTrace();
        		} catch (IllegalArgumentException iae) {    			
        			iae.printStackTrace();
        		}
    	}
       ...
    Excusez-moi pour l'indent un peu moyen, je passerais un peu de temps pour régler ça.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Est-ce que ton programme bloque sur une ligne particulière à ce moment là, où est-ce qu'il interrompt son travail et retourne à la console?

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 149
    Points : 126
    Points
    126
    Par défaut
    Comme vous l'avez surement remarqué, j'ai fait un petit println à chaque fois qu'un nouveau fichier commençait à être copié. En effet le programme met plus de temps à copier les gros fichiers, ce qui est parfaitement logique d'ailleurs. Mais une fois la copie finie, il enchaîne avec les autres fichiers.
    Je n'ai pas l'impression qu'il y ai de problème dans le code, surtout dites-moi si je me trompe!^^

    J'ai cherché un peu et j'ai trouvé le GZIPOutputStream qui supporterait des fichiers pesant plus de 2Go. Je fais quelques tests avec ça et je vous dirais si c'est convainquant!

    edit: J'ai testé le code ci-dessous sur un fichier seul pesant 7.5Go. La compression prend pas mal de temps (normal vu le poids du fichier) mais semble fonctionner correctement avec un débit plutôt bon!

    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
    		     try{
     
    		     	GZIPOutputStream gzos = new GZIPOutputStream(new FileOutputStream(zip));
     
    		         FileInputStream in = new FileInputStream(srcDir);
     
    		         int len;
    		         while ((len = in.read(buffer)) > 0) {
    		         	gzos.write(buffer, 0, len);
    		         }
     
    		         in.close();
     
    		     	gzos.finish();
    		     	gzos.close();
     
    		     } catch (FileNotFoundException e) {
    					e.printStackTrace();
    			}
    edit2: Le taux de compression est énorme! Je suis passé de 7.5Go no compressé à 6.55Go une fois compressé!
    Problème: WinRar me sort: "Fin de l'archive non attendue" :/ Même problème qu'avec le ZipOutputStream!
    Même avec un fichier de 1.25Go, le même problème se produit...

    edit3: Il semblerais qu'il soit nécessaire que le fichier output soit au format .gz avec le GZIPOutputStream, or jusque là, j'utilisais du .zip. J'ai testé, ça fonctionne mais je ne peux ni extraire, ni ajouter de fichiers à l'archive...
    Mais petit problème: le fichier contenu dans le .gz est nommé pareil que le .gz lui même. Je voudrais conserver le nom du fichier d'origine.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    gzip, c'est un format pour compresser un fichier. Ce n'est pas un format d'archive. Il n'a donc aucune meta information sur le fichier stocké.
    Pour un format d'archive (nom, dates, etc), il faut utiliser ZipOutputStream. Remarque: je vois dans ton code que tu ne précise pas la taille du fichier décompressé (zipEntry.setSize()). Je vois aussi dans la javadoc de ZipEntry que, si l'implémentation utilisée par ZipOutputStream ne supporte pas zip64, tu ne peux pas stocker une taille supérieure à 4G. Comme tu parles de fichier de 7.5G...


    edit: Commons compress te sera probablement plus utile pour gérer du lourd comme tu le fait, les classes dans java sont surtout là pour permettre à la JVM de lire les jar


    http://commons.apache.org/proper/com.../examples.html

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 149
    Points : 126
    Points
    126
    Par défaut
    Merci pour l'explication à propos du GZIP.

    4G peut-être mais cela se limite à 2G de mon côté.
    La méthode setSize() est essentielle afin que mon problème soit résolu? Si oui, comment faire pour obtenir la taille du fichier? Je n'ai pas trouvé dans la doc de la class File.

    edit: je vais essayer Common Compress merci!

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par JeremGamer Voir le message
    Si oui, comment faire pour obtenir la taille du fichier? Je n'ai pas trouvé dans la doc de la class File.

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 149
    Points : 126
    Points
    126
    Par défaut
    Pourriez-vous m'expliquer comment procéder avec Commons Compress? Je suis perdu dans leur doc!

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Je suis allé regarder la doc en question et ça va pas être possible.
    Dis-nous quelle partie de quelle page tu as essayé de lire, sans t'en sortir.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 149
    Points : 126
    Points
    126
    Par défaut
    J'ai essayé de lire la page concernant la classe ZipArchiveOutputStream, section Method Summary

  10. #10
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    C'est pas plus mal, mais regarde plutôt les exemples sur le site.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 149
    Points : 126
    Points
    126
    Par défaut
    Dans l'exemple, j'aurais besoin de quelques explications:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ZipArchiveEntry entry = new ZipArchiveEntry(name);
    entry.setSize(size);
    zipOutput.putArchiveEntry(entry);
    zipOutput.write(contentOfEntry);
    zipOutput.closeArchiveEntry();
    zipOutput est de quel type? (File ou autre?)
    contentOfEntry sort d'où?
    Comment nommer et créer le nouveau zip? (Car cet exemple montre seulement comment ajouter un fichierà un zip)

  12. #12
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    en extrapolant ces deux exemples en haut de page:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CompressorOutputStream gzippedOut = new CompressorStreamFactory()
        .createCompressorOutputStream(CompressorStreamFactory.GZIP, myOutputStream);
     
    ArchiveInputStream input = new ArchiveStreamFactory()
        .createArchiveInputStream(originalInput);
    je dirais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ArchiveOutputStream zipOutput = new ArchiveStreamFactory()
        .createArchiveOutputStream(ArchiveStreamFactory.ZIP,myOutputStream);

  13. #13
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 149
    Points : 126
    Points
    126
    Par défaut
    Si j'ai bien compris, et ce n'est pas le cas on dirait:
    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
    		byte[] buffer = new byte[32*1024];
    		ArchiveOutputStream zipOutput;
    		try {
    			ZipArchiveOutputStream out = new ZipArchiveOutputStream(new File(zipFile + "/" + name + ".zip"));
    			zipOutput = new ArchiveStreamFactory().createArchiveOutputStream(ArchiveStreamFactory.ZIP, out);		
    			ZipArchiveEntry entry = new ZipArchiveEntry(srcDir);
    			entry.setSize(new File(srcDir).length());
    			zipOutput.putArchiveEntry(entry);
    			zipOutput.write(buffer);
    			zipOutput.closeArchiveEntry();
    		} catch (ArchiveException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    J'obtiens cette erreur:
    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
    Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: No current entry
    	at org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream.write(ZipArchiveOutputStream.java:757)
    	at org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream.writeOut(ZipArchiveOutputStream.java:1287)
    	at org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream.writeOut(ZipArchiveOutputStream.java:1272)
    	at org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream.writeLocalFileHeader(ZipArchiveOutputStream.java:883)
    	at org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream.putArchiveEntry(ZipArchiveOutputStream.java:624)
    	at io.github.jeremgamer.compressor.Compressor.compressFile(Compressor.java:66)
    	at io.github.jeremgamer.compressor.Compressor$confirmButton.actionPerformed(Compressor.java:373)
    	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    	at java.awt.Component.processMouseEvent(Unknown Source)
    	at javax.swing.JComponent.processMouseEvent(Unknown Source)
    	at java.awt.Component.processEvent(Unknown Source)
    	at java.awt.Container.processEvent(Unknown Source)
    	at java.awt.Component.dispatchEventImpl(Unknown Source)
    	at java.awt.Container.dispatchEventImpl(Unknown Source)
    	at java.awt.Component.dispatchEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    	at java.awt.Container.dispatchEventImpl(Unknown Source)
    	at java.awt.Window.dispatchEventImpl(Unknown Source)
    	at java.awt.Component.dispatchEvent(Unknown Source)
    	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    	at java.awt.EventQueue.access$200(Unknown Source)
    	at java.awt.EventQueue$3.run(Unknown Source)
    	at java.awt.EventQueue$3.run(Unknown Source)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    	at java.awt.EventQueue$4.run(Unknown Source)
    	at java.awt.EventQueue$4.run(Unknown Source)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    	at java.awt.EventQueue.dispatchEvent(Unknown Source)
    	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.run(Unknown Source)

  14. #14
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    			OutputStream out = new FileOutputStream(new File(zipFile + "/" + name + ".zip"));
    			zipOutput = new ArchiveStreamFactory().createArchiveOutputStream(ArchiveStreamFactory.ZIP, out);
    Tu créais un Zip (ZipArchiveOutputStream) dans lequel tu écrivais un autre Zip (createArchiveOutputStream)

  15. #15
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 149
    Points : 126
    Points
    126
    Par défaut
    Oui en effet quelle erreur idiote!
    Mon code est maintenance le suivant:

    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
    		byte[] buffer = new byte[32*1024];
    		ArchiveOutputStream zipOutput;
    		try {
    			OutputStream out = new FileOutputStream(new File(zipFile + "/" + name + ".zip"));
    			zipOutput = new ArchiveStreamFactory().createArchiveOutputStream(ArchiveStreamFactory.ZIP, out);		
    			ZipArchiveEntry entry = new ZipArchiveEntry(srcDir);
    			entry.setSize(new File(srcDir).length());
    			zipOutput.putArchiveEntry(entry);
    			zipOutput.write(buffer);
    			zipOutput.closeArchiveEntry();
    		} catch (ArchiveException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    L'archive se créé et pas d'erreur mais celle-ci pèse 1ko et ne peut-être lue... ("Fin de l'archive non attendue")

  16. #16
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    il manque je pense un zipOutput.close() à la fin pour fermer et flusher tous les stream.
    Ell risque pas de faire beaucoup plus que 1k puisque tout ce que tu met dedans, c'est 32K de 0000000

  17. #17
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 149
    Points : 126
    Points
    126
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Ell risque pas de faire beaucoup plus que 1k puisque tout ce que tu met dedans, c'est 32K de 0000000
    Explique s'il te plait!^^

    edit: J'ai continuer à chercher et j'ai fini par réussir avec une méthode différente:

    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
    		File zip = new File(zipFile + "/" + name + ".zip");
    		try {
    			zip.createNewFile();
    		} catch (IOException e1) {
    			e1.printStackTrace();
    		}
    		ArchiveOutputStream zipOutput;
    		try {
    			OutputStream out = new FileOutputStream(zip);
    			zipOutput = new ZipArchiveOutputStream(out);		
    			ZipArchiveEntry entry = new ZipArchiveEntry(srcDir);
    			entry.setSize(new File(srcDir).length());
    			zipOutput.putArchiveEntry(entry);
    			IOUtils.copy(new FileInputStream(srcDir), zipOutput); 
                zipOutput.closeArchiveEntry();  
                zipOutput.finish();  
                zipOutput.close();  
                out.close(); 
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    Comme ceci ça fonctionne. Mais pour les gros fichiers, toujours le même problème: "Fin de l'archive non attendue"

  18. #18
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    ben étonnament, pour un compresseur, 32.000 fois zéros, c'est en général très bien compressible.

  19. #19
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 149
    Points : 126
    Points
    126
    Par défaut
    Ah oui d'accord!^^ J'ai compris d'où venait mon erreur.
    Le problème du gros fichier persisterait du fait que j'utilise IOUtils.filecopy() au lieu de ArchiveOutputStream.write()?

  20. #20
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    as-tu essayé de décompresser avec un autre programme, pour voir si ce n'est pas ton décompresseur qui pose problème? Aussi, malgré son nom, srcDir est bien un fichier hein?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Peut-on lire des gros fichiers(100k) avec "TClientSocke
    Par Fred LEM dans le forum C++Builder
    Réponses: 3
    Dernier message: 20/12/2004, 14h41
  2. Optimisation de la lecture de tres gros fichiers
    Par Lydie dans le forum C++Builder
    Réponses: 4
    Dernier message: 12/07/2004, 14h09
  3. [JDOM] Gestion "gros fichiers"
    Par Haazheel dans le forum Format d'échange (XML, JSON...)
    Réponses: 10
    Dernier message: 17/10/2003, 13h42
  4. Un langage pour lire, traiter et écrire de gros fichiers
    Par March' dans le forum Langages de programmation
    Réponses: 19
    Dernier message: 07/04/2003, 15h26
  5. XML DOM et gros fichiers
    Par Manu_Just dans le forum APIs
    Réponses: 4
    Dernier message: 28/03/2003, 09h50

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