2012-06-21 2 views
0

J'essaie de lire un fichier sur ma carte SD et d'ajouter des informations supplémentaires (très petites, comme 20 octets) et d'écrire à nouveau les informations sur ma carte SD. J'utilise FileInputStream et FileOutputStream pour lire et écrire les données. Cependant, il prend beaucoup de temps pour terminer cette opération. Par exemple, lire et écrire un fichier de 100 Mo prend environ 30 secondes.La gestion des fichiers est très lente

File file = new File(globalSelectFile); 
    byte[] b = new byte[20971520];  /Around 20MB 

    FileInputStream fin = new FileInputStream(file); 
    FileOutputStream fout = new FileOutputStream(new File(directory + "/" 
      + actualFileName)); 

Existe-t-il un moyen d'améliorer les performances?

+0

où sont écrits ces 20 octets dans le fichier: début du fichier, fin du fichier, quelque part au milieu? – Orlymee

+1

Je suis surpris que votre application n'a pas planté. Ce 'byte [] b = new byte [20971520];' allocation est trop grande pour la plupart des téléphones où la mémoire disponible est seulement de 16 Mo. Pourquoi avez-vous besoin d'un tel tampon? – dmon

+0

@dmon 20mb n'est rien pour même le G1, le premier téléphone Android qui avait 192 Mo de RAM. En 2012, la plupart ont au moins un concert, beaucoup ont 2. – 8bitwide

Répondre

0

100Mo est énorme pour un appareil de poche. Et attendez le genre de temps de réponse que vous obtenez avec un appareil ayant des ressources limitées comme un téléphone Android.

Bien que l'extrait de code ne soit pas très clair sur la façon dont vous utilisez le tableau de 20 Mo d'octets, vous pouvez probablement utiliser un OutOfMemoryError si vous utilisez des tableaux d'octets de cette taille. Si vous l'utilisez comme tampon pour copier le fichier, essayez de réduire la taille à une valeur beaucoup plus petite.

1

Les cartes SD sont lentes. A part ça, la seule autre option que je connaisse est que vous essayez de cacher cette latence à l'utilisateur. . Beaucoup d'appareils Android sont dual core maintenant quelques jours, donc je vous suggère 1, essayez de garder vos lectures et écritures au minimum et ne les faites que si nécessaire, et 2, faites-les dans un thread séparé aux moments où l'utilisateur fait quelque chose autre. c'est-à-dire prendre en compte certaines entrées de l'utilisateur, les écrire sur le disque pendant que vous en prenez d'autres.

+0

Wow, un vote négatif pour expliquer que le code ne peut pas changer les lois de la physique. Qu'est-ce que stackoverflow arrive? – 8bitwide