2010-12-11 17 views
7

J'ai besoin de créer une archive Bzip2. Une bibliothèque bzip2 téléchargée de 'Apache ant'.Java: bibliothèque Bzip2

I use class CBZip2OutputStream: 
String s = ..... 
CBZip2OutputStream os = new CBZip2OutputStream(fos); 
       os.write(s.getBytes(Charset.forName("UTF-8"))); 
       os.flush(); 
       os.close(); 

(je ne trouve pas d'exemple comment l'utiliser, alors j'ai décidé de l'utiliser de cette manière)

Mais il crée une archive corrompue sur le disque.

Répondre

7

Vous devez ajouter en-tête BZip2 (deux octets: « B », « Z ») avant d'écrire le contenu:

//Write 'BZ' before compressing the stream 
fos.write("BZ".getBytes()); 
//Write to compressed stream as usual 
CBZip2OutputStream os = new CBZip2OutputStream(fos); 
... the rest ... 

Ensuite, par exemple, vous pouvez extraire le contenu de votre fichier bzip avec cat compressed.bz2 | bunzip2 > uncompressed.txt sur un système * nix.

+0

Cela devrait, selon le code Ant lui-même: https://svn.apache.org/ viewvc/ant/core/tronc/src/main/org/apache/tools/ant/types/ressources/BZip2Resource.java? view = balisage # l71 –

2

Je n'ai pas trouvé un exemple, mais à la fin, je compris comment utiliser CBZip2OutputStream alors voici un:

public void createBZipFile() throws IOException{ 

     // file to zip 
     File file = new File("plane.jpg"); 

     // fichier compresse 
     File fileZiped= new File("plane.bz2"); 

     // Outputstream for fileZiped 
     FileOutputStream fileOutputStream = new FileOutputStream(fileZiped); 
     fileOutputStream.write("BZ".getBytes()); 

     // we getting the data in a byte array 
     byte[] fileData = getArrayByteFromFile(file); 

     CBZip2OutputStream bzip = null; 

     try{ 
      bzip = new CBZip2OutputStream(fileOutputStream); 

      bzip.write(fileData, 0, fileData.length); 
      bzip.flush() ; 
      bzip.close(); 

     }catch (IOException ex) { 

      ex.printStackTrace(); 
     } 



     fos.close(); 

    }