Compression Zlib à l'Aide de Dégonfler et de Gonfler les classes en Java
Je veux essayer d'utiliser le Dégonfler et à Gonfler les classes java.util.zip pour la compression zlib.
Je suis capable de compresser le code à l'aide de la Dégonfler, mais lors de la décompression, j'ai cette erreur -
Exception in thread "main" java.util.zip.DataFormatException: unknown compression method
at java.util.zip.Inflater.inflateBytes(Native Method)
at java.util.zip.Inflater.inflate(Inflater.java:238)
at java.util.zip.Inflater.inflate(Inflater.java:256)
at zlibCompression.main(zlibCompression.java:53)
Voici mon code jusqu'à présent -
import java.util.zip.*;
import java.io.*;
public class zlibCompression {
/**
* @param args
*/
public static void main(String[] args) throws IOException, DataFormatException {
//TODO Auto-generated method stub
String fname = "book1";
FileReader infile = new FileReader(fname);
BufferedReader in = new BufferedReader(infile);
FileOutputStream out = new FileOutputStream("book1out.dfl");
//BufferedInputStream in = new BufferedInputStream(new FileInputStream(filename));
Deflater compress = new Deflater();
Inflater decompress = new Inflater();
String readFile = in.readLine();
byte[] bx = readFile.getBytes();
while(readFile!=null){
byte[] input = readFile.getBytes();
byte[] compressedData = new byte[1024];
compress.setInput(input);
compress.finish();
int compressLength = compress.deflate(compressedData, 0, compressedData.length);
//System.out.println(compressedData);
out.write(compressedData, 0, compressLength);
readFile = in.readLine();
}
File abc = new File("book1out.dfl");
InputStream is = new FileInputStream("book1out.dfl");
InflaterInputStream infl = new InflaterInputStream(new FileInputStream("book1out.dfl"), new Inflater());
FileOutputStream outFile = new FileOutputStream("decompressed.txt");
byte[] b = new byte[1024];
while(true){
int a = infl.read(b,0,1024);
if(a==0)
break;
decompress.setInput(b);
byte[] fresult = new byte[1024];
//decompress.in
int resLength = decompress.inflate(fresult);
//outFile.write(b,0,1);
//String outt = new String(fresult, 0, resLength);
//System.out.println(outt);
}
System.out.println("complete");
}
}
est que l'un des devoirs? une seule erreur est d'appeler terminer trop tôt, une autre est à l'aide de setInput w/o longueur et un de plus n'est pas de vérifier si le dégonfler processus a retourné plus de données que le 1024.
OriginalL'auteur Ashish Agarwal | 2011-05-30
Vous devez vous connecter pour publier un commentaire.
- Ce que vous essayez de faire ici? Vous utilisez un InflaterInputStream, qui décompresse des données, puis vous essayez de passer cette décompressé données à nouveau pour un Inflater? Utiliser soit l'un d'entre eux, mais pas les deux.
C'est ce qui est à l'origine de votre exception ici.
En plus de cela, il y a bien quelques erreurs mineures, comme ceux mentionnés par bestsss:
a
, trop.Certains plus que j'ai trouvé:
readLine()
pour lire une ligne de texte, mais alors vous n'ajoutez pas de saut de ligne, ce qui implique dans votre fichier décompressé ne seront pas les sauts de ligne.Je ne vais pas essayer de corriger votre programme. Voici un exemple simple qui fait ce que je pense que vous voulez, à l'aide de DeflaterOutputStream et InflaterInputStream. (Vous pouvez également utiliser JZlib de ZInputStream et ZOutputStream à la place.)
Pour plus d'efficacité, il peut être utile pour envelopper les flux de fichiers avec tampon de flux. Si c'est critique pour les performances, de les mesurer.
unknown compression method
erreur. Si je regarde docs.oracle.com/javase/1.4.2/docs/api/java/util/zip/... ensuite, je voisInflater
de mentionner zlib, mais vous utilisezInflaterInputStream
qui mentionne dégonfler méthode de compression. C'est le fichier: dl.dropboxusercontent.com/u/17630770/temp/...InflaterInputStream utilise (si vous utilisez le constructeur sans Inflater paramètre) un
new Inflater()
. Et ce constructeur utilisenowrap = false
, ce qui signifie que la zlib-compression. (Je n'ai pas vérifier votre fichier.)OriginalL'auteur Paŭlo Ebermann
Paŭlo Ebermannle code peut être encore améliorée par l'utilisation de try-with-resources:
Ebermann: C'est un truc à lire la totalité du flux à la fois
Pourquoi
Buffered(In|Out)putStream
absent?Pour aucune raison en particulier, le code fonctionne très bien. Il serait peut-être plus rapide pour les plus gros fichiers à inclure de la mémoire tampon si les versions
OriginalL'auteur BullyWiiPlaza