Lesen eines GZipInputStreams

  • Antworten:2
p a
  • Forum-Beiträge: 131

23.11.2011, 09:06:57 via Website

Hi,

ich hab folgendes Problem und zwar versuche ich von einer URL eine GZip Datei als InputStream zu laden.
Die GZip Datei wurde mit php erstellt, sollte also ein Standardformat sein, bin mir aber nicht 100% sicher dass das ein brauchbares Format.

Hier mal die Methode
1public static InputStream getJsonStream(String url, boolean gzip)
2 {
3 try
4 {
5 HttpGet httpGet = new HttpGet(url);
6 HttpClient httpclient = new DefaultHttpClient();
7 HttpResponse response = httpclient.execute(httpGet);
8
9 if (gzip)
10 {
11 response.addHeader("Accept-Encoding", "gzip");
12 content = new GZIPInputStream(response.getEntity().getContent());
13 Log.v("### GZIP-Stream ###", url);
14 }
15 else
16 {
17 content = response.getEntity().getContent();
18 }
19 }
20 catch (Exception exc)
21 {
22 Log.v("### Exception ###", "Fehler beim Lesen der List JSON", exc);
23 }
24 return content;
25 }

Der else-Zweig (also ungeGZipped) funktioniert ohne Probleme, aber auf dem anderen Zweig bekomme ich diesen Fehler
1### Exception ###(13186): Fehler beim Lesen der List JSON
2### Exception ###(13186): java.io.IOException: unknown format (magic number a5b)
3### Exception ###(13186): at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:84)
4### Exception ###(13186): at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:64)
5### Exception ###(13186): at kommunikation.Server.getJsonStream(Server.java:66)
6### Exception ###(13186): at kommunikation.Json.jsonLaden(Json.java:289)
7### Exception ###(13186): at kommunikation.Json.access$1(Json.java:265)
8### Exception ###(13186): at kommunikation.Json$AvailabilityTask.doInBackground(Json.java:208)
9### Exception ###(13186): at kommunikation.Json$AvailabilityTask.doInBackground(Json.java:1)
10### Exception ###(13186): at android.os.AsyncTask$2.call(AsyncTask.java:185)
11### Exception ###(13186): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
12### Exception ###(13186): at java.util.concurrent.FutureTask.run(FutureTask.java:138)
13### Exception ###(13186): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
14### Exception ###(13186): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
15### Exception ###(13186): at java.lang.Thread.run(Thread.java:1019)

versteht das jemand? hat da jemand Erfahrung mit?

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

23.11.2011, 09:17:02 via Website

Ähh...jetzt überleg mal wie das funktionieren soll :)

- Du erzeugst einen Request ohne Header
- DANACH setzt du im Response (!!!) den Header für gzip Encoding.

Der Server kann dir nur gzip liefern, wenn du ihm das im REQUEST mitteilst und auch dann macht er das auch nur, wenn er das unterstützt.

Du musst es also im Request explizit anfordern, dann im Response prüfen, ob das Encoding tatsächlich gzip ist und abhängig davon den richtigen Inputstream verwenden.


EDIT:
musste noch ein bisschen ändern ;)

Siehe hierzu auch einen Thread von mir:
https://www.nextpit.de/de/android/forum/thread/437043/HttpGet-liefert-ueber-WLAN-andere-Ergebnisse-als-ueber-3G

— geändert am 23.11.2011, 09:49:26

Antworten
p a
  • Forum-Beiträge: 131

23.11.2011, 09:57:35 via Website

Ah genau, danke

das Thema "HTTP und ich" hatten wir ja schon ;)

lag in der Tat daran dass ich den Header nicht an der richtigen Stelle gesetzt habe.

Antworten