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

Android Discussion :

Compresser un stream avec ZipOutPutStream


Sujet :

Android

  1. #1
    Membre averti
    Avatar de Heavy Metal Hero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2007
    Messages : 152
    Points : 333
    Points
    333
    Billets dans le blog
    13
    Par défaut Compresser un stream avec ZipOutPutStream
    Bonjour,
    je cherche à faire un programme qui crée un fichier xml avec DocumentBuilder Transformer, StreamResult et DOMSource. ce fichier doit ensuite être compréssé en zip et envoyé vers une base de donnée (donc le fichier reste sous forme de stream).

    Voici la parti du code intéressante avant que je n'essaye de zipper :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    TransformerFactory factory = TransformerFactory.newInstance();
    Transformer transformer = factory.newTransformer();
    transformer.setOutputProperties(outFormat);
     
    OutputStream output = new ByteArrayOutputStream();
     
     
    DOMSource domSource = new DOMSource(document.getDocumentElement());
    StreamResult result = new StreamResult(output);
    transformer.transform(domSource, result);
     
    Log.i("xml : ", output.toString());
    Cela fonctionne et donne la sortie suivante dans le logcat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?xml version="1.0" encoding="UTF-8"?><catalog journal="Oracle Magazine" publisher="Oracle Publishing">
      3680                  xml :  I  <article>
      3680                  xml :  I  <edition>Sept-Oct 2005</edition>
      3680                  xml :  I  <title>Creating Search Pages</title>
      3680                  xml :  I  <author>Steve Muench</author>
      3680                  xml :  I  </article>
      3680                  xml :  I  <article>
      3680                  xml :  I  <edition>November - December 2010</edition>
      3680                  xml :  I  <title>Agile Enterprise Architecture</title>
      3680                  xml :  I  <author>Bob Rhubart</author>
      3680                  xml :  I  </article>
      3680                  xml :  I  </catalog>
    Maintenant avec le zip :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    TransformerFactory factory = TransformerFactory.newInstance();
    transformer.setOutputProperties(outFormat);
     
    OutputStream output = new ByteArrayOutputStream();
    ZipOutputStream lZipOut = new ZipOutputStream(output);
     ZipEntry lEntry = new ZipEntry("content");
    lZipOut.putNextEntry(lEntry);
     
    DOMSource domSource = new DOMSource(document.getDocumentElement());
    StreamResult result = new StreamResult(lZipOut);
    transformer.transform(domSource, result);
     
    Log.i("xml : ", output.toString());
    La sortie donne ça quelque soit le xml : "PK½ï¿½ï¿½ï¿½ï����content"
    C'est donc faux...
    Comment dois-je faire pour zipper le stream dans mon cas? et comment vérifier que le zip obtenu est correct ?

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 64
    Points : 71
    Points
    71
    Par défaut
    Salut,

    Pour compresser mes requêtes j'utilise la méthode suivante. Ca peut peut-être s'appliquer dans ton cas.


    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
    private static byte[] compress(String str) throws IOException {
     
    		ByteArrayOutputStream baos = new ByteArrayOutputStream();
    		GZIPOutputStream gzos = null;
     
    		try {
    			gzos = new GZIPOutputStream(baos);
    			gzos.write(str.getBytes("UTF-8"));
    		} finally {
    			if (gzos != null) try {
    				gzos.close();
    			} catch (IOException ignore) {
    			}
    		}
     
    		return baos.toByteArray();
     
    	}
    Après tu peux écrire le résultat dans un outpustream en faisant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    outputStream.write(resultat)

  3. #3
    Membre averti
    Avatar de Heavy Metal Hero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2007
    Messages : 152
    Points : 333
    Points
    333
    Billets dans le blog
    13
    Par défaut
    Merci de ta réponse, mais je dois utiliser les classes Document et DocumentBuilder. Je ne vois pas comment parcourir un document octet par octet, d'ou l'intérêt de ces lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DOMSource domSource = new DOMSource(document.getDocumentElement());
    StreamResult result = new StreamResult(output);
    transformer.transform(domSource, result);
    Pour info, avant cette fonction était utilisé en java pur et à la place de Transformer, DOMSource et StreamResult j'utilisais XMLSerializer. A la place des trois lignes du dessus je faisais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    serializer.setOutputByteStream(lZipOut);
    serializer.serialize(lDoc);
    Une idée ?

  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
    Citation Envoyé par Heavy Metal Hero Voir le message

    La sortie donne ça quelque soit le xml : "PK½ï¿½ï¿½ï¿½ï����content"
    C'est donc faux...
    Comment dois-je faire pour zipper le stream dans mon cas? et comment vérifier que le zip obtenu est correct ?
    Tu as oublié de faire un

    lZipOut.close()

    avant d'aller voir ce qu'il y a dans ton ByteArrayOutputstream. Toujours fermer ses flux

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2012
    Messages : 133
    Points : 122
    Points
    122
    Par défaut
    http://developer.android.com/referen...putStream.html.

    Et si tu faisais comme ca :
    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
     
    TransformerFactory factory = TransformerFactory.newInstance();
    Transformer transformer = factory.newTransformer();
    transformer.setOutputProperties(outFormat);
     
    OutputStream output = new ByteArrayOutputStream();
     
     
    DOMSource domSource = new DOMSource(document.getDocumentElement());
    StreamResult result = new StreamResult(output);
    transformer.transform(domSource, result);
     
    Log.i("xml : ", output.toString());
     
    OutputStream os = ...
     ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(os));
     try {
     
             String filename = "content";
     
             byte[] bytes = output.toString().getBytes();
     
             ZipEntry entry = new ZipEntry(filename);
             zos.putNextEntry(entry);
             zos.write(bytes);
             zos.closeEntry();
     } finally {
         zos.close();
     }
    Mais je ne sais pas ce que ca vaut, j'y ai juste pensé en regardant, donc si c'est faut je sors ->[].

  6. #6
    Membre averti
    Avatar de Heavy Metal Hero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2007
    Messages : 152
    Points : 333
    Points
    333
    Billets dans le blog
    13
    Par défaut
    J'avais mis les close, j'ai juste oublié de les préciser dans la portion de code. J'ai enfin réussi à zipper mon fichier, sur la ligne : "StreamResult result = new StreamResult(lZipOut);" je plaçais le résultat directement à la place du zip, alors que c'est le contenu du zip qu'il faut remplacer. J'ai remplacé lZipOut par output et c'était bon.

    Après j'ai voulu générer le zip en fichier pour tester.
    Quand je cat le .zip :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    KC�Ccontent<?xml version="1.0" encoding="UTF-8"?><catalog journal="Oracle Magazine" publisher="Oracle Publishing">
    <article>
    <edition>Sept-Oct 2005</edition>
    <title>Creating Search Pages</title>
    <author>Steve Muench</author>
    </article>
    <article>
    <edition>November - December 2010</edition>
    <title>Agile Enterprise Architecture</title>
    <author>Bob Rhubart</author>
    </article>
    </catalog>
    PPKC�CcontentPK57
    Visuellement ça m'a l'air correct, le xml est bien encapsulé.

    Ensuite dans l'explorateur graphique je peux l'ouvrir et il y a bien un fichier "content" dedans, mais il fait 0 octet (alors que l'archive en fait 5) et il y a cette erreur quand j'ouvre "content" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    warning [/users/t0094390/adt-bundle-linux-x86_64-20130729/sdk/platform-tools/KOKO.zip]:  375 extra bytes at beginning or within zipfile
      (attempting to process anyway)
    file #1:  bad zipfile offset (local header sig):  375
      (attempting to re-compensate)
     
      error:  invalid compressed data to inflate
    Il y a donc une erreur dans les bits illisibles, le .zip n'est pas valide...

    Voici le code :

    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 file = new File(Environment.getExternalStorageDirectory().getAbsoluteFile()+"/KOKO.zip");
                FileOutputStream output = new FileOutputStream(file);
              //  ByteArrayOutputStream output = new ByteArrayOutputStream();
                ZipOutputStream lZipOut = new ZipOutputStream(output);
                ZipEntry lEntry = new ZipEntry("content");
                lZipOut.putNextEntry(lEntry);
     
                DOMSource domSource = new DOMSource(document.getDocumentElement());
                StreamResult result = new StreamResult(output);
                transformer.transform(domSource, result);
     
     
                Log.i("xml : ", output.toString());
              /*  String xmlString = output.toString();
                xmlResult.setText(xmlString);*/
                lZipOut.closeEntry();
                lZipOut.flush();
                lZipOut.close();
     
                output.flush();
                output.close();
    J'ai l'impression que l'entry n'est jamais utilisé mais je ne vois pas comment faire autrement... Ou est l'erreur ?

  7. #7
    Membre averti
    Avatar de Heavy Metal Hero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2007
    Messages : 152
    Points : 333
    Points
    333
    Billets dans le blog
    13
    Par défaut
    John BE a trouvé la solution ! c'est le write qui manquait !
    Merci pour tout !

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

Discussions similaires

  1. Utiliser les Streams avec TSocket
    Par francky23012301 dans le forum Web & réseau
    Réponses: 8
    Dernier message: 02/05/2006, 23h07
  2. Compression vidéo, problème avec VCM
    Par Neilos dans le forum Windows
    Réponses: 4
    Dernier message: 05/11/2005, 13h27
  3. Réponses: 4
    Dernier message: 03/08/2005, 09h47
  4. Comment compresser un stream ?
    Par lafaryan dans le forum Composants VCL
    Réponses: 2
    Dernier message: 09/01/2005, 20h05

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