2010-11-20 18 views
3

J'ai besoin de compresser des données provenant d'un flux et de mettre des données compressées dans un autre. Voici le code qui fonctionne avec les fichiers (MyOutputStream est un simple wrapper FileOutputStream utilisé à des fins de débogage). Ce code fonctionne bien.ZipOutputStream n'écrit pas le contenu du fichier

 ZipOutputStream jos = new ZipOutputStream(new MyOutputStream(new FileOutputStream(zipFileName))); 
     jos.setLevel(Deflater.DEFAULT_COMPRESSION); 
     jos.putNextEntry(new ZipEntry("test.txt")); 
     FileInputStream in = new FileInputStream("test.txt"); 

     int len; 
     while ((len = in.read(buffer)) > 0){ 
      jos.write(buffer, 0, len); 
     } 
     jos.closeEntry(); 
     jos.close(); 

Dans ma vraie application, je dois faire face à des flux plus complexes. En fait, les flux sont utilisés pour CORBA interop. Cependant, les données sont lues avec succès. Mais lorsque j'essaie de faire jos.write(buffer, 0, len);, aucune donnée n'est écrite dans le flux de sortie sous-jacent à ZipOutputStream. Cependant, les en-têtes de fichiers zip, les commentaires d'entrées et le répertoire central sont écrits avec succès, donc je reçois un zip absolument valide avec une seule exception: les fichiers sont vides.

Peut-être que quelqu'un avait déjà vu ce comportement auparavant? Toute aide est appréciée.

EDIT Voici mon code réel tel qu'il peut être utile:

String fileName = fullSourcePath.substring(fullSourcePath.lastIndexOf('\\') + 1, fullSourcePath.length()); 
WrapperOutputStream out = new WrapperOutputStream(newexchangeStream64); 
ZipOutputStream jos = new ZipOutputStream(out); 
jos.setLevel(Deflater.NO_COMPRESSION); 

jos.putNextEntry(new ZipEntry(fileName)); 
jos.setComment("Comment"); 
IDLDataHolder data = new IDLDataHolder(); 
LongHolder dataAmount = new LongHolder(); 
LongHolder written = new LongHolder(); 

while (true) { 
    exchangeStream64.Read(data, READ_AMOUNT, dataAmount); 
    if (0 == dataAmount.value) { 
     break; 
    } 

    jos.write(data.value, (int)dataAmount.value, (int)written.value); 
} 
jos.closeEntry(); 
jos.close(); 
+0

Pourriez-vous poster cette partie particulière de votre application? Ou est-ce trop grand? – thejh

+0

Ajout d'un vrai code – Ola

+0

Je ne sais pas 'IDLDataHolder' - est-ce un tampon avec une taille supérieure à zéro? – thejh

Répondre

2
LongHolder written = new LongHolder(); 

while (true) { 
    exchangeStream64.Read(data, READ_AMOUNT, dataAmount); 
    if (0 == dataAmount.value) { 
     break; 
    } 

    jos.write(data.value, (int)dataAmount.value, (int)written.value); 
} 

Il peut être juste une erreur de pâte copie &, mais le dernier paramètre de jos.write est toujours 0. C'est la quantité d'octets à écrire à partir du tableau.

+0

Merci! C'est une erreur de copier/coller vraiment stupide. Je me suis cassé la tête en déboguant tous ces flux :) – Ola