Étant donné une chaîne qui n'est pas trop longue, quelle est la meilleure façon de la lire ligne par ligne?
Je sais que tu peux faire:
BufferedReader reader = new BufferedReader(new StringReader(<string>));
reader.readLine();
Une autre façon serait de prendre la sous-chaîne sur l'eol:
final String eol = System.getProperty("line.separator");
output = output.substring(output.indexOf(eol + 1));
Y a-t-il d'autres façons peut-être plus simples de le faire? Je n'ai aucun problème avec les approches ci-dessus, juste intéressé de savoir si l'un d'entre vous sait quelque chose qui peut paraître plus simple et plus efficace?
Réponses:
Vous pouvez également utiliser la
split
méthode de String:Cela vous donne toutes les lignes dans un tableau pratique.
Je ne connais pas les performances de Split. Il utilise des expressions régulières.
la source
line.separator
et que quelqu'un d'autre la lit sur Windows en utilisantline.separator
, elle est toujours bosselée. Ce ne sont pas des codeurs incapables de faire des choses stupides, c'est juste comment les choses (ne fonctionnent pas toujours).Il y a aussi
Scanner
. Vous pouvez l'utiliser comme leBufferedReader
:Je pense que c'est une approche un peu plus propre que les deux suggérées.
la source
Comme j'étais particulièrement intéressé par l'angle d'efficacité, j'ai créé une petite classe de test (ci-dessous). Résultat pour 5.000.000 de lignes:
Comme d'habitude, les heures exactes peuvent varier, mais le ratio est vrai quelle que soit la fréquence à laquelle je l'ai exécuté.
Conclusion: les exigences "plus simples" et "plus efficaces" de l'OP ne peuvent pas être satisfaites simultanément, la
split
solution (dans les deux cas) est plus simple, mais laReader
mise en œuvre bat les autres haut la main.la source
lines()
fonction renvoyant uneStream<String>
des lignes, que vous pouvez rassembler dans une liste si vous le souhaitez, ou traiter le flux.En utilisant Apache Commons IOUtils, vous pouvez le faire facilement via
Il ne fait rien d'intelligent, mais c'est joli et compact. Il gérera également les flux, et vous pouvez en obtenir un
LineIterator
aussi si vous préférez.la source
IOUtils.readlines(Reader)
crée un fichierIOException
. Même si cela ne se produira probablement jamais avec un StringReader, vous devrez l'attraper ou le déclarer.Solution utilisant des
Java 8
fonctionnalités telles queStream API
etMethod references
ou
la source
Depuis Java 11, il existe une nouvelle méthode
String.lines
:Usage:
la source
Vous pouvez utiliser l'API de flux et un StringReader enveloppés dans un BufferedReader qui a obtenu une sortie de flux lines () dans java 8:
Donne
Tout comme dans readLine de BufferedReader, les caractères de nouvelle ligne eux-mêmes ne sont pas inclus. Tous les types de séparateurs de nouvelle ligne sont pris en charge (même dans la même chaîne).
la source
Vous pouvez aussi utiliser:
Si cela ne fonctionne pas, essayez de remplacer
\n
par\r\n
.la source
Ou utilisez la clause new try with resources combinée à Scanner:
la source
Vous pouvez essayer l'expression régulière suivante:
Code:
Production:
la source
L'approche la plus simple et la plus universelle serait d'utiliser simplement l'expression régulière
Linebreak matcher
\R
qui correspond àAny Unicode linebreak sequence
:@see https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/regex/Pattern.html
la source