2009-08-13 18 views
10

Ich bin auf ein seltsames Problem beim Lesen von einem InputStream auf der Android-Plattform. Ich bin mir nicht sicher, ob dies ein Android-spezifisches Problem ist oder etwas, das ich generell falsch mache.IOException beim Lesen von InputStream

Das einzige, was Android spezifisch ist, ist dieser Aufruf:

InputStream is = getResources().openRawResource(R.raw.myfile); 

Dies gibt einen Input für eine Datei aus dem Android Assets. Wie auch immer, hier ist, wo ich in der Frage führen:

bytes[] buffer = new bytes[2]; 
is.read(buffer); 

Wenn die read() führt er eine IOException wirft. Das Seltsame ist, dass es keine Ausnahme gibt, wenn ich zwei aufeinanderfolgende Einzelbyte-Lesevorgänge (oder eine beliebige Anzahl von Einzelbyte-Lesevorgängen) mache. Im Beispiel ist dies funktioniert:

byte buffer; 
buffer = (byte)buffer.read(); 
buffer = (byte)buffer.read(); 

Jede Idee, warum zwei aufeinanderfolgende einzelne Byte lesen Arbeit, sondern ein Aufruf beide auf einmal zu lesen, eine Ausnahme auslöst? Die InputStream scheint gut ... is.available() gibt über eine Million Bytes zurück (wie es sollte).

Stapelüberwachung zeigt diese Zeilen kurz vor dem InputStream.read():

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) 

Ändern der Puffergröße auf ein Byte wirft immer noch den Fehler. Es sieht so aus, als ob die Ausnahme nur beim Lesen in ein Byte-Array ausgelöst wird.

Wenn ich die Datei auf 100.000 Bytes abschneide (Datei ist: 1.917.408 Bytes ursprünglich), funktioniert es gut. Gibt es ein Problem mit Dateien ab einer bestimmten Größe?

Jede Hilfe wird geschätzt!
Danke!

+0

Eine 1MB Datei gearbeitet, aber eine 1,5 MB-Datei nicht. Gibt es eine Größenbeschränkung für Assets? – DJayC

Antwort

14

(mein Beitrag zu Android-Entwickler nicht angezeigt wird, so dass ich werde versuchen, es hier reposting)

IIRC, dieses Problem kommt von dem Versuch, auf Dateien zuzugreifen, die als Teil der APK des Gebäudes komprimiert wurden.

Geben Sie daher eine Dateierweiterung, die nicht komprimiert wird, um das Problem zu umgehen. Ich vergesse die Liste, welche Erweiterungen übersprungen werden, aber Dateitypen, von denen bekannt ist, dass sie bereits komprimiert sind (z. B. mp3, jpg), funktionieren möglicherweise.

+1

Sie haben absolut Recht. Das Umbenennen der Erweiterung in .MP3 funktionierte. Dies ist ein dummer Fehler, und es sollte eine Möglichkeit geben, es zu sagen, dass eine bestimmte Datei nicht komprimiert wird, wenn es diese Art von Problem verursacht. Danke – DJayC

+0

@ CommonsWare: Gibt es andere Methoden, komprimierte Datei von Asset zu lesen? Ich meine, Datei wird beim Packen in APK komprimiert, aber wir können Asset-Datei lesen? – VSB

0

Sie haben Recht, es gibt eine bestimmte Größenbeschränkung für das Extrahieren von Dateien. Sie möchten vielleicht größere Dateien in 1MB-Teile aufteilen und haben eine Methode, mit der Sie wissen, welche Dateien aus welchen Stücken bestehen, und diese wieder zusammenfügen, wenn Ihre App läuft.

3

Ändern der Dateierweiterung auf .mp3, um die Dateikomprimierung zu vermeiden funktioniert, aber die APK der App ist viel größer (in meinem Fall 2,3 MB statt 0,99 MB).

Gibt es eine andere Möglichkeit, dieses Problem zu vermeiden?

Hier ist meine Antwort: Load files bigger than 1M from assets folder