utilisation de l'API java.util.zip

manurevait
utilisation de l'API java.util.zip

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.

Quote:

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 ? :(

fredericmazue

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.

manurevait

fredericmazue wrote:
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) :!:

fredericmazue

Je t'ai dit que c'était tout simple, donc il ne faut pas faire compliqué
Qu'est-ce que ça fait là ça ?

Quote:

// é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);

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 ?

manurevait

fredericmazue wrote:
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

fredericmazue

Quote:
Si j'ai bien compris il suffit de transmetre le fichier à compresser (sans le faire byte par byte)

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.

Quote:
mais je n'ai pas trouver comment le faire, je n'ai rien trouver ni sur le net ni dans mon bouquin Java.

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();
  }
}
manurevait

Quote:
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

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