IoException enquanto lê a partir do InputStream
-
13-09-2019 - |
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!
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.