Pergunta

Estou enfrentando um problema estranho enquanto lê um InputStream na plataforma Android. Não tenho certeza se esse é um problema específico do Android, ou algo que estou fazendo de errado em geral.

A única coisa que é específica do Android é esta chamada:

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

Isso retorna um InputStream Para um arquivo dos ativos Android. De qualquer forma, é aqui que eu encontro o problema:

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

Quando o read () executa, joga um Ioexception. O estranho é que, se eu fizer duas leituras sequenciais de byte único (ou qualquer número de leituras de byte único), não há exceção. Em exemplo, isso funciona:

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

Alguma idéia de por que dois byte sequenciais lê funcionam, mas uma chamada para ler ambos de uma só vez joga uma exceção? o InputStream Parece bom ... is.available() Retorna mais de um milhão de bytes (como deveria).

Stack Trace mostra essas linhas antes do 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)

Alterar o tamanho do buffer para um único byte ainda lança o erro. Parece que a exceção só é levantada ao ler uma matriz de bytes.

Se eu truncar o arquivo para 100.000 bytes (o arquivo é: 1.917.408 bytes originalmente), ele funciona bem. Existe um problema com os arquivos sobre um determinado tamanho?

Qualquer ajuda é apreciada!
Obrigado!

Foi útil?

Solução

(Minha postagem para o Android-Developers não está aparecendo, então tentarei repitá-lo aqui)

IIRC, esse problema vem da tentativa de acessar arquivos que foram compactados como parte da construção do APK.

Portanto, para contornar o problema, dê uma extensão de arquivo que não será compactada. Eu esqueço a lista de quais extensões são ignoradas, mas os tipos de arquivos que já são compactados (por exemplo, MP3, JPG) podem funcionar.

Outras dicas

Alterando a extensão do arquivo para .mp3 Para evitar a compactação do arquivo, funciona, mas o APK do aplicativo é muito maior (no meu caso 2,3 MB em vez de 0,99 MB).

Existe alguma outra maneira de evitar esse problema?

Aqui está minha resposta:Carregar arquivos maiores que 1 m da pasta de ativos

Você pode comprimir o arquivo com GZIP e descompactá -lo com a classe GzipinputStream.

http://developer.android.com/reference/java/util/zip/gzipinputstream.html

Você está correto, pois existe um certo limite de tamanho para extrair arquivos. Você pode dividir arquivos maiores em peças de 1 MB e ter um método pelo qual você sabe quais arquivos são feitos de quais peças, costurando -as novamente quando o aplicativo é executado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top