58 votes

Quelle est la meilleure façon d'itérer sur les lignes d'une chaîne Java ?

Actuellement, j'utilise quelque chose comme :

 String[]lines = textContent.split(System.getProperty("line.separator"));
for(String tmpLine : lines){
   //do something
}

Je ne suis pas très content de cette méthode car elle crée un tableau lourd (disons que textContent peut contenir un livre).

Existe-t-il une meilleure solution pour itérer sur les lignes d'un String ?

73voto

Guillaume Polet Points 31933

Vous pouvez utiliser :

 BufferedReader bufReader = new BufferedReader(new StringReader(textContent));

Et utilisez la méthode readLine()

 String line=null;
while( (line=bufReader.readLine()) != null )
{

}

26voto

leo Points 561

Pour ajouter la méthode Java 8 à cette question :

 Arrays.stream(content.split("\\r?\\n")).forEach(line -> /*do something */)

Bien sûr, vous pouvez également utiliser System.lineSeparator() pour diviser si vous êtes sûr que le fichier provient de la même plate-forme que celle sur laquelle la machine virtuelle s'exécute.

Ou encore mieux utiliser l'api stream encore plus agressive avec filtrer, mapper et collecter :

 String result = Arrays.stream(content.split(System.lineSeparator()))
                     .filter(/* filter for lines you are interested in*/)
                     .map(/*convert string*/)
                     .collect(Collectors.joining(";"));

10voto

nullpointer Points 1135

Je pense que vous avez une meilleure API disponible à partir de Java-11 où vous pouvez faire la même chose en utilisant l' String.lines() qui renvoie le flux de chaînes extraites de cette chaîne partitionnée par des terminateurs de ligne.

 public Stream<String> lines()

L'utilisation de la même chose pourrait être : -

 Stream<String> linesFromString = textContent.lines();
linesFromString.forEach(l -> {  //do sth });

Remarque importante sur l'API : -

 @implNote This method provides better performance than
          split("\R") by supplying elements lazily and
          by faster search of new line terminators.

7voto

Brendan Points 1814

Vous pouvez utiliser String.indexOf()/String.substring()

 String separator = System.getProperty("line.separator");
int index = textContent.indexOf(separator);

while (index > 0)
{
  int nextIndex = textContent.indexOf(separator, index + separator.length());
  String line = textContent.substring(index + separator.length(), nextIndex);

  // do something with line.
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X