Domanda

Sono in esecuzione in uno strano problema durante la lettura da un InputStream sulla piattaforma Android. Non sono sicuro se questo è un problema specifico di Android, o qualcosa che sto facendo male in generale.

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

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

Questo restituisce un InputStream di un file dal patrimonio Android. In ogni modo, ecco dove mi imbatto in questione:

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

Quando la read () esegue genera un IOException . La cosa strana è che se faccio due sequenziali singolo byte legge (o un qualsiasi numero di singolo byte legge), non esiste alcuna 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? Il InputStream sembra che vada bene ... is.available() rendimenti oltre un milione di byte (come dovrebbe).

Analisi dello stack 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)

La modifica della dimensione del buffer per un singolo byte tiri ancora l'errore. Sembra che l'eccezione viene generato solo quando si legge in un array di byte.

Se io troncare il file di 100.000 byte (file è: 1,917,408 byte in origine) funziona benissimo. C'è un problema con i file di una certa dimensione?

Ogni aiuto è apprezzato!
Grazie!

È stato utile?

Soluzione

(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, dare un'estensione di file che non sarà compresso. Ho dimenticato l'elenco di ciò che le estensioni sono saltati, ma i tipi di file noti per essere già compressi (ad esempio, mp3, jpg) può funzionare.

Altri suggerimenti

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

C'è un altro modo per evitare questo problema?

Ecco la mia risposta: file href="https://stackoverflow.com/questions/2860157/load-files-bigger-than-1m-from-assets-folder"> carico

Lei ha ragione, nel senso che c'è un certo limite di dimensione per l'estrazione dei file. Si potrebbe desiderare di dividere i file più grandi in pezzi 1MB, e hanno un metodo con il quale si sa quali file sono fatti di quali pezzi, li cuciture di nuovo insieme quando le corse app.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top