2010-02-11 6 views
3

J'utilise la fonction de base suivante que je copiais du filet pour lire un fichier texteComment faire Java lire de très gros fichiers en utilisant Scanner?

public void read() 
{ 
    File file = new File("/Users/MAK/Desktop/data.txt"); 
    System.out.println("Start"); 
    try 
    { 
     // 
     // Create a new Scanner object which will read the data from the 
     // file passed in. To check if there are more line to read from it 
     // we check by calling the scanner.hasNextLine() method. We then 
     // read line one by one till all line is read. 
     // 
     Scanner scanner = new Scanner(file); 
     int lineCount = 0; 
     if (scanner == null) 
     { 
      System.out.println("Null File"); 
     } 
     else 
     { 
      System.out.println(scanner.toString()); 
     } 
     while (scanner.hasNextLine()) 
     { 
      String line = scanner.nextLine(); 

      System.out.println("Line " + lineCount +" contain : " + line); 
      lineCount++; 
     } 
     System.out.println("End of Try Bluck"); 
    } 
    catch (FileNotFoundException e) 
    { 
     e.printStackTrace(); 
     System.out.println("Exception Bluck"); 
    } 
    System.out.println("End"); 
} 
} 

Il fonctionne très bien avec les petites et moyennes taille de fichier (qui contiennent 10-20000 ligne de données) Cependant il a échoué à travailler avec un fichier qui contient 500 mille lignes. Je ne reçois pas d'erreur (du moins, je ne vois personne). Alors, quoi de neuf? Que devrais-je faire ici pour pouvoir préparer de si gros fichiers?

Note: Je l'ai déjà augmenté le tas pour 2 Go sur la machine de test qui exécutent Windows Server 2008 avec 4 ram Go. mais cela n'a pas aidé beaucoup!

S'il vous plaît quelqu'un peut me dire ce que je dois faire ici?


Mise à jour 01

Ce qui suit est la sortie

Démarrer

java.util.Scanner [délimiteurs = \ p {} javaWhitespace +] [position = 0 ] [match valide = faux] [besoin d'entrée = faux] [source fermée = faux] [sauté = faux] [séparateur de groupe = \,] [séparateur décimal =.] [préfixe positif =] [préfixe négatif = \ Q- \ E] [suffixe positif =] [suffixe négatif =] [NaN st anneau = \ Q \ E] [chaîne de l'infini = \ Q∞ \ E]

Fin de Try Bluck

Fin

Répondre

5

Mieux vaut aller pour BufferedReader avec un FileReader

+1

Vous êtes le meilleur! :) BufferedReader a résolu le problème! Merci! Je vous remercie! Je vous remercie! Je vous remercie! Je vous remercie! Je vous remercie! Je vous remercie! Je vous remercie! Je vous remercie! Je vous remercie! Je vous remercie! –

1

Si vous n'êtes pas obtenir une erreur, il se pourrait bien que prendre beaucoup de temps. Le disque est-il toujours actif? Que faites-vous avec la sortie de la console - a-t-elle arrêté? Vous dites que cela n'a pas fonctionné, mais vous n'avez pas dit comment cela se passait. Que vois-tu?

mémoire ne doit pas être un problème que vous ne faites quoi que ce soit avec les lignes - il suffit de les compter et de les écrire à la console.

Un problème dans votre code - vous vérifiez si scanner est nulle, mais elle ne peut peut-être être, parce que vous utilisez la référence retournée par un appel constructeur. Dans quelle situation essayiez-vous de faire face?

+0

Je pensais que cela prend beaucoup de temps, mais la sortie montre déjà le résultat de la dernière instruction d'impression ce qui signifie qu'il a fait travailler. Cette classe devrait faire partie de mon programme qui doit traiter chaque ligne puis la mettre dans un nouveau fichier. Une idée de quoi faire? –

Questions connexes