2009-08-13 14 views
10

Si verifica uno strano problema durante la lettura da un InputStream sulla piattaforma Android. Non sono sicuro che si tratti di un problema specifico di Android o di qualcosa che sto sbagliando in generale.IOException durante la lettura da InputStream

L'unica cosa che è specifica Android è questa chiamata:

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

Ciò restituisce un InputStream per un file dalle attività Android. In ogni modo, ecco dove mi imbatto in questione:

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

Quando il read() esegue viene generata IOException. La cosa strana è che se faccio due letture sequenziali a byte singolo (o un numero qualsiasi di letture di un singolo byte), non c'è eccezione. Nell'esempio, questo funziona:

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

Qualsiasi idea del perché due sequenziali singolo byte legge lavoro, ma una chiamata di leggere entrambi contemporaneamente genera un'eccezione? InputStream sembra corretto ... is.available() restituisce oltre un milione di byte (come dovrebbe).

traccia Pila mostra queste righe poco prima della 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) 

Cambiare la dimensione del buffer per un singolo byte getta ancora l'errore. Sembra che l'eccezione venga sollevata solo durante la lettura in un array di byte.

Se il file viene troncato a 100.000 byte (il file è: 1.917.408 byte in origine) funziona correttamente. C'è un problema con i file di una certa dimensione?

Qualsiasi aiuto è apprezzato!
Grazie!

+0

Un file 1MB lavorato, ma un file di 1,5 MB no. C'è qualche restrizione di dimensione per i beni ?? – DJayC

risposta

14

(il mio post per Android gli sviluppatori non viene visualizzato, quindi cercherò reinserire qui)

IIRC, questo problema deriva dal tentativo di accedere ai file che sono stati compressi come parte della costruzione della APK.

Quindi, per aggirare il problema, dargli un'estensione di file che non sarà compresso. Ho dimenticato l'elenco delle estensioni saltate, ma i tipi di file noti per essere già compressi (ad esempio, mp3, jpg) potrebbero funzionare.

+1

Hai assolutamente ragione. Rinominare l'estensione in .MP3 ha funzionato. Questo è un insetto bug e dovrebbe esserci un modo per dirgli di non comprimere un determinato file se questo causerà questo tipo di problema. Grazie – DJayC

+0

@ CommonsWare: Esistono altri metodi per leggere il file compresso dalla risorsa? Voglio dire che il file viene compresso durante l'imballaggio in APK ma possiamo leggere il file degli asset? – VSB

0

Si è corretto, in quanto esiste un limite di dimensioni per l'estrazione di file. Potresti voler dividere file più grandi in pezzi da 1 MB e avere un metodo con cui sai quali file sono fatti di quali pezzi, ricucendoli di nuovo insieme quando viene eseguita la tua app.

3

Cambiare l'estensione del file .mp3 per evitare la compressione dei file funziona, ma l'APK dell'app è molto più grande (nel mio caso 2.3 MB invece di 0,99 MB).

C'è qualche altro modo per evitare questo problema?

Ecco la mia risposta: Load files bigger than 1M from assets folder

Problemi correlati