Comment lire un gros fichier texte ligne par ligne à l'aide de Java?
J'ai besoin de lire un texte de grande taille de fichier d'environ 5-6 GO ligne par ligne à l'aide de Java.
Comment puis-je le faire rapidement?
- et. al. Cette question ne doit pas être marqué comme un doublon. "Vite lu la dernière ligne" n'est pas une alternative, et de son droit de se demander si "le moyen le plus Rapide pour lire fichier texte ligne par ligne" est. Le moyen le plus rapide pour faire quelque chose n'est pas nécessairement la façon la plus commune. En outre, les réponses ci-dessous incluent le code, la plupart des alternatives pertinentes vous de la liste ne pas. Cette question est utile. Il est actuellement le plus de résultats de recherche google pour "java lire le fichier ligne par ligne". Enfin, sa mise hors d'arriver à un débordement de pile et de trouver que 1 personne sur 2 est marqué pour l'élimination.
- Ici c'est une comparaison de la vitesse pour six implémentations possibles.
- L'évènement, j'ai lu des commentaires affirmant que c'est TELLEMENT proche de la politique suce, DONC persiste en elle. C'est un esprit étroit point de vue développeur de vouloir éviter la redondance au niveau de tous les coûts! Juste que ce soit! La crème va monter vers le haut et le sh*t va couler au fond de l'amende juste par lui-même. Même si une question a pu être posée avant (la question n'est-ce pas??), cela ne signifie pas qu'une nouvelle question peut ne pas être en mesure de l'exprimer mieux, obtenir des réponses de meilleure qualité, rang plus élevé dans les moteurs de recherche etc. Fait intéressant, cette question est maintenant de "protégé"....
- C'est incroyable comment les questions marqués comme en double juste en lisant le titre.
Vous devez vous connecter pour publier un commentaire.
Un modèle commun est d'utiliser
Vous pouvez lire les données plus rapidement si vous assumez il n'y a pas de codage de caractères. par exemple ASCII-7, mais il ne fera pas beaucoup de différence. Il est très probable que ce que vous faites avec les données prendra beaucoup plus de temps.
EDIT: UNE commune de moins de motif, ce qui évite le champ d'application de
line
fuite.Mise à JOUR: En Java 8, vous pouvez faire
REMARQUE: Vous devez placer le Ruisseau dans une essayez-avec-des ressources block pour s'assurer que le #fermer méthode est appelée sur elle, sinon, le fichier sous-jacent de la poignée n'est jamais fermée jusqu'à ce que GC n'est que bien plus tard.
close();
if (line.matches(regexLineFormat))
retrait qui a accéléré les choses beaucoup. J'ai encore besoin d'utiliserStringTokenizer
pour marquer la chaîne. Mais son beaucoup plus vite maintenant, merci!((line = br.readLine()) != null)
. Cette condition est pas effacer.for(String line = br.readLine(); line != null; line = br.readLine())
Btw, dans Java 8, vous pouvez fairetry( Stream<String> lines = Files.lines(...) ){ for( String line : (Iterable<String>) lines::iterator ) { ... } }
Qui est difficile de ne pas la haine.Oeil à ce blog:
DataInputStream
, et le mauvais flux est fermé. Rien de mal avec le Java Tutoriel, et pas besoin de citer arbitraire Internet tiers des ordures comme ceci.Une fois java-8 est de sortir (Mars 2014), vous serez en mesure d'utiliser les flux:
Impression de toutes les lignes dans le fichier:
StandardCharsets.UTF_8
, utilisezStream<String>
pour la concision, et éviter d'utiliserforEach()
et surtoutforEachOrdered()
moins qu'il y a une raison.forEach(this::process)
, mais il devient laid si vous écrivez des blocs de code que les lambdas à l'intérieur deforEach()
.forEachOrdered
afin de les exécuter dans l'ordre. Sachez que vous ne serez pas capable de paralléliser le flux dans ce cas, même si j'ai trouvé que la parallélisation ne s'allume pas sauf si le fichier a des milliers de lignes.Voici un exemple avec plein d'erreur de manipulation et de soutien charset spécification pour le pré-Java 7. Avec Java 7, vous pouvez utiliser essayez-avec-les ressources de la syntaxe, ce qui rend le code plus propre.
Si vous voulez juste le jeu de caractères par défaut, vous pouvez ignorer l'InputStream et l'utilisation FileReader.
Ici est la version Groovy, avec plein d'erreur de manipulation:
ByteArrayInputStream
alimenté par un littéral de chaîne ont à voir avec la lecture d'un gros fichier texte?Dans Java 8, vous pouvez faire:
Quelques remarques: Le flux renvoyé par
Files.lines
(contrairement à la plupart des cours d'eau) doit être fermé. Pour les raisons mentionné ici - je éviter d'utiliserforEach()
. L'étrange code(Iterable<String>) lines::iterator
jette un Flux vers un objet iterable.Iterable
ce code est définitivement vilain bien que utile. Il a besoin d'un plâtre (c'est à dire(Iterable<String>)
) au travail.Stream
caractéristiques, à l'aide deFiles.newBufferedReader
au lieu deFiles.lines
et à plusieurs reprises d'appelerreadLine()
jusqu'ànull
au lieu d'utiliser des constructions comme les(Iterable<String>) lines::iterator
semble être beaucoup plus simple...Iterable
(ceci est possible carIterable
est une interface fonctionnelle). Pour la boucle, puis effectue une itération sur ce nouvel objet. Tout cela est nécessaire parce que l'interfaceStream
n'hérite pas deIterable
en dépit de la satisfaction de son contrat.Ce que vous pouvez faire est de scanner l'ensemble du texte à l'aide du Scanner et de passer par le texte ligne par ligne.
Bien sûr, vous devez importer les suivants:
Scanner fondamentalement scanne l'intégralité du texte. La boucle while est utilisée pour parcourir l'intégralité du texte.
La
.hasNextLine()
fonction est une valeur booléenne qui renvoie true si il y a encore plus de lignes dans le texte. Le.nextLine()
fonction vous donne une ligne entière comme une Chaîne de caractères que vous pouvez utiliser comme vous le souhaitez. EssayezSystem.out.println(line)
pour imprimer le texte.Note De Côté: .txt est le type de fichier texte.
BufferedReader.readLine()
, et il a demandé pour la meilleure performance de la méthode.FileReader ne vous laisseront pas de spécifier l'encodage, l'utilisation
InputStreamReader
à la place si vous avez besoin de le préciser:Si vous avez importé ce fichier à partir de Windows, il peut avoir l'encodage ANSI (Cp1252), vous devez spécifier l'encodage.
Files.newBufferedReader
Dans Java 7:
StandardCharsets.UTF_8
pour éviter l'objet d'une exception enCharset.forName("UTF-8")
J'ai documenté et testé 10 façons différentes de lire un fichier en Java, puis a couru l'un contre l'autre en les faisant lire dans les fichiers de test à partir de 1 KO à 1 go. Voici la manière la plus rapide de fichiers 3 les méthodes de lecture pour la lecture d'un 1 go de fichier de test.
Noter que lors de l'exécution des tests de performance, je n'ai pas l'affichage de la console parce que ce serait vraiment ralentir le test. Je voulais juste tester la lecture brute de vitesse.
1) de java.nio.fichier.Les fichiers.readAllBytes()
Testé dans Java 7, 8, 9. Ce fut dans l'ensemble, la méthode la plus rapide. La lecture d'un fichier de 1 go a été constamment un peu moins de 1 seconde.
2) de java.nio.fichier.Les fichiers.lignes()
Cela a été testé avec succès dans Java 8 et 9, mais il ne fonctionnera pas dans Java 7 en raison de l'absence de soutien pour les expressions lambda. Il a fallu environ 3,5 secondes pour lire dans un fichier de 1 go qui a mis en deuxième place en ce qui concerne la lecture des fichiers plus volumineux.
3) BufferedReader
Testé pour fonctionner dans Java 7, 8, 9. Cela a pris environ 4,5 secondes pour lire dans un 1 go de fichier de test.
Vous pouvez trouver les classements complets pour tous les 10 fichier méthodes de lecture ici.
Pour la Lecture du fichier avec java 8
Vous pouvez utiliser le Scanner de classe
Scanner
est bien, mais cette réponse n'a pas d'inclure le code pour l'utiliser correctement.BufferedReader.readLine()
est certainement plusieurs fois plus rapide. Si vous pensez le contraire, veuillez fournir vos raisons.Dans Java 8, il existe une alternative à l'utilisation de
Fichiers.lignes()
. Si votre source d'entrée n'est pas un fichier, mais quelque chose de plus abstrait comme unReader
ou unInputStream
, vous pouvez flux les lignes via leBufferedReader
slines()
méthode.Par exemple:
appellera
processLine()
pour chaque ligne de saisie lu par leBufferedReader
.Vous devez utiliser le
readLine()
méthode dansclass BufferedReader
.Créer un nouvel objet de cette classe et de faire fonctionner cette méthode sur lui et l'enregistrer sur une chaîne.
BufferReader Javadoc
Java-9 :
System.getProperty("os.name").equals("Linux")
==
!Le moyen de parvenir,
Par exemple:
Si vous avez
dataFile.txt
sur votre répertoire courantLa sortie, comme ci-dessous,
Cela fonctionne pour moi. Espérons qu'Il saura vous aider aussi.
J'ai l'habitude de faire la routine de lecture simple:
Vous pouvez utiliser les flux de le faire plus précisément:
Vous pouvez également utiliser
apache commons io
:FileUtils.readLines(file)
est une méthode dépréciée. En outre, la méthode appelleIOUtils.readLines
, qui utilise un BufferedReader et ArrayList. Ce n'est pas une, ligne par ligne, de la méthode, et certainement pas l'un qui serait pratique pour la lecture de plusieurs GO.Vous pouvez utiliser ce code:
en utilisant org.apache.commons.io package a donné plus de performances, en particulier dans l'ancien code qui utilise Java 6 et ci-dessous.
Java7 a mieux API avec le moins d'exceptions
la manipulation et la plus utile des méthodes
maven