BufferedReader wirft unter Android 2.2 IO.Exception wenn das File zu groß wird ->bessere Lösungsmöglichkeiten?

  • Antworten:14
Christopher
  • Forum-Beiträge: 38

09.09.2011, 08:48:50 via Website

Hallo,

ich habe folgendes Problem. Wenn ich mein Programm unter Android 2.2 laufen lasse, bekomme ich beim einlesen eines .json Files eine IO. Exception. Was ich bisher in Erfahrung gebracht habe, liegt das an der Größe der Datei (bei mir etwas über 2mb). Unter Android 2.3 läuft das aber Problemlos.
Nun habe ich eine Lösung gefunden, die mich aber nicht wirklich zufrieden stellt. Wenn man die Dateiendung in .mp3 oder .gif ändert funktioniert alles wunderbar.
Kennt jemand das Problem? Und weiß vielleicht wie man Android dazu bringt auch große .json Datein einzulesen?

Viele Grüße

Christopher

Antworten
Markus B.
  • Forum-Beiträge: 636

09.09.2011, 09:22:02 via App

Hi, also 2 MB ist jetzt nicht wirklich groß. Hast du mal den Stacktrace da und evtl. ein Beispiel, um den Fehler nachvollziehen zu können?

Gruß,
Markus

Antworten
Christopher
  • Forum-Beiträge: 38

09.09.2011, 09:54:34 via Website

Der in etwa so aus wie hier auch: http://groups.google.com/group/android-developers/browse_thread/thread/e3765c112d112f24

java.io.IOException
at android.content.res.AssetManager.readAsset(Native Method)
at android.content.res.AssetManager.access$800(AssetManager.java:36)
at android.content.res.AssetManager$AssetInputStream.read
(AssetManager.java:542)

Der Fehler ist an sich wohl bekannt, ich finde nur keine schönere Möglichkeit ihn zu umgehen.

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

09.09.2011, 10:28:01 via Website

Das liegt an der Größenbeschränkung von Dateien die im assets Ordner liegen. Diese Beschränkung liegt bei ca. 1MB.

Das hat nichts mit Deinem Programm oder mit der API zu tun.

Früher waren nur gepackte Dateien betroffen da diese zum entpacken in einen internen Speicher geladen werden mussten und dieser war auf 1MB begrenzt. Seit dieser Zeit splitte ich immer alle Dateien, die in den assets Ordner gehören, in 800KB Blöcke und lese (und verarbeite) diese binär.

Datei 001.001
Datei 001.002
Datei 001.003

Datei 002.001
...

Antworten
Christopher
  • Forum-Beiträge: 38

09.09.2011, 10:57:09 via Website

Aber wieso funktioniert das mit meinem LG Optimus Speed und der MIUI Rom (2.3.4) dann problemlos?

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

09.09.2011, 11:16:50 via Website

weil das ne custom rom ist und das dort vielleicht geändert wurde


wenn du große dateien mit deiner app auslieferst, werden deine user sowieso keine freude mit dir haben.

szenario:
der user sitzt in der ubahn - hat ein datenlimit von 300mb - findet deine app - ist deine app zu groß, wird er sie nicht runterladen. bis er zu hause im wlan ist, hat er deine app schon wieder vergessen.

hol dir doch die dateien einfach übers netz beim ersten start. informier den user, dass er dateien laden muss. das kann er dann auch im wlan daheim machen und hat die app aber schon installiert.

nur so ein vorschlag

swordiApps Blog - Website

Antworten
Christopher
  • Forum-Beiträge: 38

09.09.2011, 11:48:32 via Website

Die Daten werden nicht aus dem Netz runtergeladen, sondern liegen im raw Ordner der App.

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

09.09.2011, 12:07:09 via Website

deshalb auch mein langer text

swordiApps Blog - Website

Antworten
Christopher
  • Forum-Beiträge: 38

09.09.2011, 12:55:28 via Website

Sorry,... aber die Daten erst aus dem Netz zu laden umgeht ja mein Problem nicht oder? Ich müsste sie ja trozdem irgendwo speichern, damit ich sie beim nächsten Start wieder habe. Und genau da tritt ja das Problem auf. Ich denke das splitten in kleine Teile ist bisher die beste Lösung.

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

09.09.2011, 14:57:08 via Website

Es kann gut sein das diese Beschränkung in neueren Versionen gefallen ist. Da ich aber auch, je nach Projekt, ältere Android Versionen unterstützen muss splitte ich alle assets Daten - egal auf welchem Gerät das mal laufen wird.

Damit hatte ich noch nie Probleme.

Antworten
Christopher
  • Forum-Beiträge: 38

09.09.2011, 20:08:33 via Website

wie splittest du deine Dateien denn? Per Hand oder hast du dafür ein Programm? Und wie liest du die dann anschließend ein? Legst du für jede Datei manuell einen neuen Inputfilestream an oder geht das irgendwie komfortabler?

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

10.09.2011, 00:06:50 via Website

Zum Splitten nehme ich ein uralt Programm - HJSplit.

Eine Routine wie diese alte zum Kopieren einer mitgelieferten Datenbank im assets Ordner ist schnell genug. Das geht sicherlich noch eleganter - hat sich aber lange bewährt:

1private void copyDatenbank() throws IOException {
2 InputStream inputStream = null;
3 OutputStream outputStream = null;
4
5 if ((outputStream = new FileOutputStream(DATENBANK_PFADNAME)) != null) {
6 int i = 1;
7 DecimalFormat decimalFormat = new DecimalFormat("#000");
8
9 while ((inputStream = context.getAssets().open("Datenbank/" + DATENBANK_PREFIX + "." + decimalFormat.format(i))) != null) {
10
11 byte[] buffer = new byte[8096];
12 int length;
13 while ((length = inputStream.read(buffer)) > 0) {
14 outputStream.write(buffer, 0, length);
15 }
16
17 i = i + 1;
18 }
19
20 outputStream.close();
21 }
22 }

Antworten
Christopher
  • Forum-Beiträge: 38

12.09.2011, 10:39:08 via Website

Ganz großes Dankeschön :) Das war genau das was ich gesucht habe. Funktioniert auch super und hat den riesen Vorteil das ich mit einem kleinerem heap auskomme. Die While Schleife stoppt bei dir auch mit einer Exception oder?

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

12.09.2011, 12:45:38 via Website

Stimmt. Das ist der Zugriff auf die nicht mehr vorhandene nächste Nummer. Wollte ich schon immer mal eleganter machen ... ach was solls ;-)

Gruß
Harald

Antworten