IOException lors de la lecture d'InputStream
Je suis en cours d'exécution dans un étrange problème lors de la lecture d'un InputStream sur la plate-forme Android. Je ne suis pas sûr si c'est un Android problème spécifique, ou quelque chose que je fais mal en général.
La seule chose qui est Android spécifique est cet appel:
InputStream is = getResources().openRawResource(R.raw.myfile);
Il renvoie un InputStream pour un fichier à partir de l'Android actifs. De toute façon, c'est là que je tombe sur la question:
bytes[] buffer = new bytes[2];
is.read(buffer);
Lors de la lecture() exécute, il jette un IOException. La chose étrange est que si je fais deux séquentielle seul octet lit (ou n'importe quel nombre d'octet lit), il n'y a pas d'exception. Dans l'exemple, cela fonctionne:
byte buffer;
buffer = (byte)buffer.read();
buffer = (byte)buffer.read();
Aucune idée pourquoi deux séquentielle seul octet lit de travail, mais un appel à lire les deux à la fois, déclenche une exception? Le InputStream semble bien... is.available()
retourne plus d'un million d'octets (comme il se doit).
Trace de la pile de montre ces lignes juste avant la 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 modification de la taille de la mémoire tampon d'un seul octet en jette toujours l'erreur. Il ressemble à l'exception n'est soulevée lors de la lecture dans un tableau d'octets.
Si je tronquer le fichier pour 100 000 octets (fichier est: 1,917,408 octets à l'origine), il fonctionne très bien. Est-il un problème avec les fichiers de plus d'une certaine taille?
Toute aide est très appréciée!
Merci!
source d'informationauteur DJayC
Vous devez vous connecter pour publier un commentaire.
(mon post pour android-les développeurs ne s'affiche pas, donc je vais essayer de reposter ici)
IIRC, ce problème vient d'essayer d'accéder à des fichiers qui ont été compressés dans le cadre de la construction de l'APK.
Donc, pour contourner le problème, lui donner une extension de fichier qui ne sera pas compressé. J'ai oublier la liste de ce que les extensions sont ignorées, mais les types de fichiers connus pour être déjà compressé (par exemple, mp3, jpg).
De changer l'extension du fichier .mp3 pour éviter la compression de fichier fonctionne, mais l'APK de l'application est beaucoup plus grand (dans mon cas, 2.3 MO au lieu de 0,99 MO).
Est-il un autre moyen pour éviter ce problème ?
Voici ma réponse:
Charger les fichiers de plus de 1M à partir d'éléments de dossier
Vous pouvez compresser le fichier pour vous-même avec GZIP et décompressez-le avec GZIPInputStream classe.
http://developer.android.com/reference/java/util/zip/GZIPInputStream.html
Vous avez raison, qu'il y a une certaine limite de taille pour l'extraction des fichiers. Vous pouvez séparer les gros fichiers en pièces de 1 mo, et avoir une méthode qui vous permet de connaître les fichiers qui sont faits de morceaux, de les assembler à nouveau ensemble lorsque votre application s'exécute.