Charger les fichiers de plus de 1M à partir d'éléments de dossier
Je suis fou, j'ai créé un fichier objet, de sorte qu'il peut être lu avec un ObjectInputStream, et j'ai placé le dossier assets.
La méthode fonctionne avec un fichier plus petit que 1M, et de donner d'erreur avec les fichiers de grande taille.
J'ai lu que c'est une limite de la plate-forme Android, mais je sais aussi que peut être "facilement" à éviter.
Ceux qui ont téléchargé le jeu Reging Tonnerre, par exemple, peut facilement voir que dans leurs actifs dossier est un fichier de 18,9 M de large.
C'est mon code pour lire 1 objet à partir d'une ObjecInputStream
File f = File.createTempFile("mytempfile", "dat");
FileOutputStream fos = new FileOutputStream(f);
InputStream is = mc.getAssets().open(path,3);
ObjectInputStream ois=new ObjectInputStream(is);
byte[] data = (byte[]) ois.readObject();
fos.write(data);
fos.flush();
fos.close();
ois.close();
is.close();
maintenant, j'ai un fichier non compressé et je peux l'utiliser sans se soucier de l'erreur "Ce fichier ne peut être ouvert comme un descripteur de fichier; il est sans doute comprimé"
Cette fonction fonctionne bien avec des fichiers de taille inférieure à 1 M, avec des fichiers plus gros retour d'un
java.io.IOException sur la ligne "ObjectInputStream ois=new ObjectInputStream(est);"
pourquoi??
Vous devez vous connecter pour publier un commentaire.
Face à la même question. J'ai couper mon 4 MO de fichiers de 1 MO morceaux, et sur le premier run, je rejoins les morceaux dans un dossier de données sur le téléphone. Comme un bonus supplémentaire, l'APK est bien compressé. Le morceau fichiers sont appelés 1.db, 2.db, etc. Le code qui va comme ceci:
La limitation est comprimé actif. Si l'actif est non compressé, le système peut carte mémoire les données du fichier et utiliser le Linux de pagination de mémoire virtuelle du système pour tirer ou jeter blocs de 4 ko appropriées. (Le "zipalign" outil assure que non compressé actifs sont les mots alignés dans le fichier, ce qui signifie qu'ils vont être alignés dans la mémoire lorsqu'elle est directement mappée.)
Si l'actif est compressé, le système a pour décompresser de la chose entière de la mémoire. Si vous avez un 20 MO d'actifs, cela signifie que 20 mo de mémoire physique est liée par votre application.
Idéalement, le système devrait utiliser une sorte de fenêtre de compression, de sorte que seules les parties doivent être présentes, mais qui nécessite un certain fanciness dans l'actif de l'API et un système de compression qui fonctionne bien avec un accès aléatoire. Maintenant APK == Zip avec "dégonfler" la compression, ce qui n'est pas pratique.
Vous pouvez garder vos actifs non compressé en leur donnant un suffixe d'un type de fichier qui n'est pas compressé (par exemple ".png" ou ".mp3"). Vous pouvez également être en mesure de les ajouter manuellement pendant le processus de construction avec "zip -0" au lieu de les avoir regroupés par aapt. Ce sera probablement augmenter la taille de votre fichier APK.
Comme Seva suggéré, vous pouvez diviser votre fichier en morceaux. J'ai utilisé cette option pour que mon fichier de 4 mo
Si vous n'avez pas besoin de combiner les fichiers en un seul fichier sur le périphérique, il suffit d'utiliser cette InputStream, qui combine en une seule à la volée.
Utilisation:
ObjectInputStream ois = new ObjectInputStream(new SplitFileInputStream("mytempfile", ".dat", 4, getAssets()));
int read
a de la valeur-1
etfos.write
a échoué. J'ai changé l'écriture mécanisme commeif (read > -1) { fos.write(buf, 0, read); }'. Next issue belongs to
SplitFileInputStream` classe. Méthodepublic int read(byte[] b)
ne fonctionne pas bien. Alors je l'ai changé analogiquement commepublic int read(byte[] b, int offset, int length)
méthode.public int read(byte[] b) throws IOException { int read = currentIs.read(b); if (read < b.length && currentChunk < numberOfChunks) { currentIs.close(); currentIs = am.open(baseName + ++currentChunk + ext, AssetManager.ACCESS_STREAMING); byte[] buffer = new byte[b.length - read]; read += read(buffer); } return read; }
Changer l'extension du fichier .mp3
Je sais que c'est une vieille question, mais j'ai pensé à une bonne solution.
Pourquoi ne pas stocker le fichier d'ores et déjà pré-zippé dans le dossier actif.
Alors, puisque c'est déjà un fichier zip, et donc compressée, elle n'aura pas besoin d'être comprimée à nouveau. Donc, si vous voulez que le fichier compressé pour réduire la taille de votre apk, mais vous ne voulez pas avoir affaire avec fractionnement des fichiers, je pense que c'est plus facile.
Quand vous en avez besoin pour lire ce fichier arrêt de l'appareil juste envelopper les inputstream dans un zipinputstream
http://developer.android.com/reference/java/util/zip/ZipInputStream.html
J'ai trouvé une autre solution, peut-être vous êtes intéressé à elle.
Dans la racine de vos sources, où vous avez la
build.xml
fichier, vous pouvez remplacer le-package-resources
cible dans lecustom_rules.xml
fichier, qui est utilisé pour l'ajout/modification des cibles ant sans casser quoi que ce soit dans la norme de l'application pour android système de construction.Il suffit de créer un fichier avec le contenu:
ajouter une extension de fichier est mp3.J'utilise mydb.mp3in actifs dossier et copie .cette course sans erreur.show case.
À l'aide de GZIP serait une autre méthode. vous avez seulement besoin d'envelopper InputStream à l'intérieur de GZIPInputStream.
J'ai utilisé ce pour une base de données dont la taille environ 3,0 MO de sortie et de compresser le fichier a été d'environ 600 KO.
outil.
(ces processus sont réalisées avant de compiler FICHIER APK).
et de les copier:
définir la base de données de plusieurs partie avec un programme d'e.g "Gagner Hex", vous pouvez télécharger à partir de Lien
et continuer Charger les fichiers de plus de 1M à partir d'éléments de dossier
Au lieu de dossier assets, j'ai mis mon gros fichiers en raw dossier. Il fonctionne pour moi.
J'utilise NetBeans pour construire le paquet et j'ai pas trouvé comment modifier les paramètres de AAPT.
Je n'ai pas essayé le png, mais le mp3 compressés.
Je peux compiler le paquet, puis entrez le dossier assets avec le paramètre -0?
quel serait le bon de commande à utiliser?