Bonjour,
Je souhaite dans un pg Java faire une compression Zip.
L'interface fait une compression des bytes par défaut or j'ai besoin de la faire des caractères ASCII.
Ces classes ne sont pas dérivée des classes Reader et Writer, mais à la place font partie des hiérarchies d'InputStream et OutputStream. Ceci parcque la libraire de compression fonctionne avec des bytes, pas des caractères. Cependant, vous serez parfois forcés de mixer les deux types de fluxs. (Rappellez-vous que vous pouvez utiliser InputStreamReader et OutputStreamWriter pour fournirune conversion facile entre un type et un autre.)
http://www.liafa.jussieu.fr/~yunes/Java/es/
Quelqu'un saurait-il comment spécifier le mode caractère ? :(


Je ne comprends rien au délire que tu as cité. Pour faire ce que tu veux, il suffit de créer un FileOutputStream en donnant le nom de fichier zip à créer, puis de créer un ZipOutputStream en donnant le FileOutputStream précedemment créé au constructeur du ZipOutputStream. C'est tout ce qu'il y a à faire.
Bonjour,
Voici le code utilisé:
try { // création d'un flux d'écriture sur fichier FileOutputStream dest = new FileOutputStream( zipFileName+ ".zip"); // calcul du checksum : Adler32 (plus rapide) ou CRC32 CheckedOutputStream checksum = new CheckedOutputStream(dest, new Adler32()); // création d'un buffer d'écriture BufferedOutputStream buff = new BufferedOutputStream(checksum); // création d'un flux d'écriture Zip ZipOutputStream out = new ZipOutputStream(buff); // spécification de la méthode de compression out.setMethod(ZipOutputStream.DEFLATED); // spécifier la qualité de la compression 0..9 out.setLevel(Deflater.BEST_COMPRESSION); // buffer temporaire des données ‡ écriture dans le flux de sortie byte data[] = new byte[BUFFER]; // création d'un flux de lecture FileInputStream fi = new FileInputStream(source); // création d'un tampon de lecture sur ce flux BufferedInputStream buffi = new BufferedInputStream(fi, BUFFER); // création d'en entrée Zip pour ce fichier ZipEntry entry = new ZipEntry(unAccent(source)); // ajout de cette entrée dans le flux d'écriture de l'archive Zip out.putNextEntry(entry); // écriture du fichier par paquet de BUFFER octets // dans le flux d'écriture int count; while((count = buffi.read(data, 0, BUFFER)) != -1) { out.write(data, 0, count); } // Close the current entry out.closeEntry(); // fermeture du flux de lecture buffi.close(); // fermeture du flux d'écriture out.close(); buff.close(); checksum.close(); dest.close(); retour = 15; // traitement de toute exception } catch(Exception e) { e.printStackTrace(); test.log_erreur( e.getMessage(), this ); return "pb"+retour; } return "0"; }Le recepteur du fichier me dit que ce dernier n'est pas dans le bon format (bytes et non caractère) :!:
Je t'ai dit que c'était tout simple, donc il ne faut pas faire compliqué
Qu'est-ce que ça fait là ça ?
Tu écris directement un buffer de byte, faut pas trop t'étonner. Pour faire un zip il suffit d'ajouter des entrées sous forme de fichiers à priori pré-existants et contenant les données. Ils correspondent à quelle entrée/fichier les bytes que tu écris *directement* dans le zip ?
Si j'ai bien compris il suffit de transmetre le fichier à compresser (sans le faire byte par byte) mais je n'ai pas trouver comment le faire, je n'ai rien trouver ni sur le net ni dans mon bouquin Java.
voici ma methode:
public String ZipOneFile(String zipFileName, String source ) { int retour = 0; /************* * Compression *************/ try { // création d'un flux d'écriture sur fichier FileOutputStream dest = new FileOutputStream( zipFileName+ ".zip"); // calcul du checksum : Adler32 (plus rapide) ou CRC32 CheckedOutputStream checksum = new CheckedOutputStream(dest, new Adler32()); // création d'un buffer d'écriture BufferedOutputStream buff = new BufferedOutputStream(checksum); // création d'un flux d'écriture Zip ZipOutputStream out = new ZipOutputStream(buff); // spécification de la méthode de compression out.setMethod(ZipOutputStream.DEFLATED); // spécifier la qualité de la compression 0..9 out.setLevel(Deflater.BEST_COMPRESSION); // buffer temporaire des données ‡ écriture dans le flux de sortie byte data[] = new byte[BUFFER]; // création d'un flux de lecture FileInputStream fi = new FileInputStream(source); // création d'un tampon de lecture sur ce flux BufferedInputStream buffi = new BufferedInputStream(fi, BUFFER); // création d'en entrée Zip pour ce fichier ZipEntry entry = new ZipEntry(unAccent(source)); // ajout de cette entrée dans le flux d'écriture de l'archive Zip out.putNextEntry(entry); // écriture du fichier par paquet de BUFFER octets // dans le flux d'écriture int count; while((count = buffi.read(data, 0, BUFFER)) != -1) { out.write(data, 0, count); } // Close the current entry out.closeEntry(); // fermeture du flux de lecture buffi.close(); // fermeture du flux d'écriture out.close(); buff.close(); checksum.close(); dest.close(); // traitement de toute exception } catch(Exception e) { e.printStackTrace(); test.log_erreur( e.getMessage(), this ); return "pb"+retour; } return "0"; }Merci pour tes lumières :idea:
Manu
Hem je me suis très mal exprimé je pense. J'ai voulu dire qu'il fallait injecter les fichiers et leur contenu sans faussement dire que le contenu est des bytes. Si tu dis que c'est des bytes avec ton tableau de bytes tu écris des bytes dans l'archive, pas des caractères alors qu'il y a très probablement des caractères dans les fichiers.
C'est pour ça que ce forum existe :)
Alors voilà un exemple. Soient deux fichiers programmez.txt et abonnement.txt. les fichiers existent (dans le répertoire de l'utilisateur) et contiennent du texte.
On les met tous les deux dans l'archive monzip.zip
import java.io.*; import java.util.zip.*; public class CreateZip { String[] fichiers = { "programmez.txt", "abonnement.txt", }; public void createZip() { FileUtilities.setWorkingDirectory(); String prefix = System.getProperty("user.dir"); try { FileOutputStream fos = new FileOutputStream(System.getProperty("user.dir") + File.separator + "monzip.zip"); ZipOutputStream zos = new ZipOutputStream(fos); for(int i=0; i<fichiers.length; i++) { ZipEntry entree = new ZipEntry(fichiers[i]); zos.putNextEntry(entree); // Ici copier le fichier File f = new File(prefix + File.separator + fichiers[i]); InputStream in = new FileInputStream(f); while (in.available() > 0) zos.write(in.read()); in.close(); zos.closeEntry(); } zos.close(); } catch(IOException ioe) { ioe.printStackTrace(); } } public static void main(String[] args) { CreateZip cz = new CreateZip(); cz.createZip(); } }Voici ce qui me parait enfin très claire.
Merci pour ton aide. :D
Comme je n'ai qu'un fichier à compresser j'ai adapter ton exemple à mon cas d'utilisation.
Voici le résultat:
public String ZipOneFileB(String zipFileName, String source ) { int retour = 0; /************* * Compression *************/ try { // création d'un flux d'écriture sur fichier FileOutputStream dest = new FileOutputStream( zipFileName+ ".zip"); // calcul du checksum : Adler32 (plus rapide) ou CRC32 CheckedOutputStream checksum = new CheckedOutputStream(dest, new Adler32()); // création d'un buffer d'écriture BufferedOutputStream buff = new BufferedOutputStream(checksum); // création d'un flux d'écriture Zip ZipOutputStream out = new ZipOutputStream(buff); // spécification de la méthode de compression out.setMethod(ZipOutputStream.DEFLATED); // spécifier la qualité de la compression 0..9 out.setLevel(Deflater.BEST_COMPRESSION); // buffer temporaire des données ‡ écriture dans le flux de sortie byte data[] = new byte[BUFFER]; ZipEntry entree = new ZipEntry(source); out.putNextEntry(entree); File f = new File(source); InputStream in = new FileInputStream(f); while (in.available() > 0) out.write(in.read()); in.close(); // Close the current entry out.closeEntry(); // fermeture du flux d'écriture out.close(); buff.close(); checksum.close(); dest.close(); // traitement de toute exception } catch(Exception e) { e.printStackTrace(); test.log_erreur( e.getMessage(), this ); return "pb"+retour; } return "0"; }___________
Cordialement,
Manu