Bonsoir à tous !
Alors voila, je cherche à lire de gros fichiers CSV sur un terminal android. Ca a l'air trivial comme ca, mais un téléphone est beaucoup plus lent qu'un PC, et je n'arrive pas à trouver un moyen d'optimiser le temps de lecture...
Pour info, je cherche à lire un "petit" fichier pour l'instant (8000 lignes / 20 colonnes), qui représente ~2Mo. Mon programme actuel converti (en gros) mon fichier en List<String[]>. Cette opération dure en moyenne 160 ms en application Java 1.6 (mode release), mais presque 4 secondes en mode application Android sur mon HTC Desire (mode release egallement).
Quelqu'un connaitrait-il un autre moyen, rapide et efficace, de lire mon fichier pour obtenir des String[] (ou eventuellement des List<String> ) ? Le but étant par la suite de remplir des objets
Voici mon code actuel (un peu tronqué) :
Code :
- public class CFichierTabule {
- //~~~~~~~~~~ Attributs ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- // Séparateur utilisé pour lire / écrire le fichier tabulé
- private char m_Separateur = '\t';
-
- private boolean m_ChargementOK = false;
-
- //~~~~~~~~~~ Méthodes publiques ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- // Constructeur de la classe CFichierTabule
- public CFichierTabule (String CheminFichier) {
- List<String> ContenuFichier = LireFichier (CheminFichier);
-
- if (ContenuFichier == null || ContenuFichier.size() == 0)
- return;
-
- List<String[]> ListeEnregistrementsString = ObtenirEnregistrementsString (ContenuFichier);
- //(...)
- m_ChargementOK = true;
- }
-
-
-
- //~~~~~~~~~~ Méthodes privées ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- // Parcours le fichier et renvois son contenu sous forme de liste de Strings
- private List<String> LireFichier (String CheminFichier) {
- List<String> ContenuFichier = null;
-
- try {
- File Fichier = new File (CheminFichier);
- if (!Fichier.exists())
- return null;
-
- FileReader Lecteur = new FileReader (Fichier);
- BufferedReader Buffer = new BufferedReader (Lecteur);
-
- ContenuFichier = new ArrayList<String>();
-
- String LigneLue;
- while ((LigneLue = Buffer.readLine()) != null) {
- ContenuFichier.add(LigneLue.trim());
- }
- Lecteur.close();
- Buffer.close();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
-
- return ContenuFichier;
- }
-
- //----------------------------------------------------------------------------------------------
-
- // Converti une liste de Strings en liste de String[]
- private List<String[]> ObtenirEnregistrementsString (List<String> ContenuFichier) {
- String Separateur = new Character (m_Separateur).toString();
-
- int NbEnregistrements = ContenuFichier.size();
- List<String[]> ListeEnregistrementsString = new ArrayList<String[]> (NbEnregistrements);
-
- //@ HFR : Je saute la première ligne car c'est les entêtes, et qu'elles sont traitées à part
- for (int IEnregistrement = 1 ; IEnregistrement < NbEnregistrements ; IEnregistrement++) {
- String LigneFichier = ContenuFichier.get(IEnregistrement);
- ListeEnregistrementsString.add (LigneFichier.split(Separateur));
- }
-
- return ListeEnregistrementsString;
- }
- }
|
Je remercie d'avance toute personne qui pourra m'apporter ses lumières
Edit : Soyez tolérants, maîtres incontestés de Java qui lirez mon message ! Je débute dans ce langage, j'ai quelques lointaines bases remontant à l'école, et j'ai toujours fait que du C++. J'essaye de me mettre à ce langage que je trouve intéressant, donc si vous voyez de grosses bourdes de naab en Java, mes excuses !
Edit : Ajout de "Android" dans le titre, c'est plus parlant
Message édité par Profil supprimé le 24-02-2012 à 23:40:32