# GZIP format Fehler



## Shoox (1. Mrz 2011)

Hallo,
ich bekomme von einem Unternehmen (Kreditkarten) Dateien im .gz Format (entpackte Datei sollte ein xml sein) nur schaffe ich es nicht das Teil zu entpacken.

Hier mal meine Methode die ich dafür geschrieben bzw im Netz gefunden habe:
[JAVA=27]public void decompress(String source, String dest) throws FileNotFoundException, IOException {
      String destination = dest;
      if (dest == null || dest.isEmpty()){
         destination = source.substring(0, source.length() - 3);
      }
      GZIPInputStream is = null;
      FileOutputStream os = null;
      try{
         is = new GZIPInputStream(new FileInputStream(source));
         os = new FileOutputStream(destination);
         byte[] buffer = new byte[8192];
         for (int length; (length = is.read(buffer)) != -1{
            os.write(buffer, 0, length);
         } 
      }finally{
         if (os != null) try{ os.close(); }catch (IOException e){}
         if (is != null) try{ is.close(); }catch (IOException e){}
      }
   }[/code]

Leider bekomme ich immer die gleiche Fehlermeldung:

```
java.io.IOException: Not in GZIP format
	at java.util.zip.GZIPInputStream.readHeader(GZIPInputStream.java:137)
	at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:58)
	at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:68)
	at com.xxx.xxx.utils.GunZip.decompress(GunZip.java:35)
```
Ist die Datei korrupt oder mache ich irgendwas falsch? Das die Datei korrupt ist glaube ich fast nicht, kommt nml von einem Kreditkarteninstitut und nja, wir werden nicht die einzigen sein, die die Daten in .gz bekommen. Habs aber auch versucht mit 7zip zu öffnen, leider auch ohne Erfolg. 

Dann hab ich mal versucht die ersten Bytes auszulesen, wie es GZIPInputStream für die Magic Number macht - Ausgabe:
Read Number: 61215
Magic Number: 35615

Ich bin mit meinem Latein am Ende... hat jemand von euch eine Idee?

Danke im Vorraus,
Shoox


----------



## DerEisteeTrinker (1. Mrz 2011)

Als erstes würde ich händisch überprüfen, ob ein GZIP-Entpacker etwas mit der Datei überhaupt anfangen kann. Wenn nicht, dann hast da eine defekte Datei und dein Code ist erstmal nicht defekt.

Ansonsten würde ich vllt so einen Schnipsel probieren. Da achtest nicht auf die Länge und kommst damit nicht durcheinander


```
is = new GZIPInputStream(new FileInputStream(source));
os = new FileOutputStream(destination);
byte[] buffer = new byte[8192];
while(is.read(buffer) != -1) {
     os.write(buffer);
}
```


----------



## Shoox (1. Mrz 2011)

Habs an unsere "Serverfarmbeauftragen" mal weitergegeben, um zu sehen, ob es mit nem gunzip klappt - auch der gleiche Fehler. Das heißt wohl, dass die Datei defekt ist. Hätt ich net erwartet, dass die mir was falsches schicken, aber nja, kann man nichts machen.
Danke für den Codeschnipsel, ist besser lesbar und hat den gleichen Effekt =)
Bevor ich das hier zumache, warte ich mal auf neue Daten. Jedenfalls danke.


----------



## DerEisteeTrinker (1. Mrz 2011)

echt das for-schleifen-konstrukt hat genau den gleichen Effekt? man lernt nie aus. Hab ja schon viel Augenkrebs beim Programmieren gesehen, aber das sieht so cool aus, ich glaube das werde ich ganz sicher iwo einbauen, nur um einen Kollegen zu ärgern. :lol::lol::lol::lol:


----------



## Lumaraf (1. Mrz 2011)

DerEisteeTrinker hat gesagt.:


> Als erstes würde ich händisch überprüfen, ob ein GZIP-Entpacker etwas mit der Datei überhaupt anfangen kann. Wenn nicht, dann hast da eine defekte Datei und dein Code ist erstmal nicht defekt.
> 
> Ansonsten würde ich vllt so einen Schnipsel probieren. Da achtest nicht auf die Länge und kommst damit nicht durcheinander
> 
> ...



InputStream.read liest aber nicht immer die gleiche Menge an bytes. OutputStream.write(byte[]) schreibt aber immer den kompletten Buffer. Am Ende der Datei werden dann also sehr warscheinlich zuviele Daten geschrieben.


```
is = new GZIPInputStream(new FileInputStream(source));
os = new FileOutputStream(destination);
byte[] buffer = new byte[8192];
int len;
while((len=is.read(buffer)) != -1) {
     os.write(buffer,0,len);
}
```


----------



## Shoox (8. Mrz 2011)

so, habe neue Daten bekommen die auch entpackbar sind. Danke für eure Hilfe!
PS: entpacken funktioniert mit 

```
int len;
while((len=is.read(buffer)) != -1) {
   os.write(buffer,0,len);
}
```
wunderbar =)


----------

