迭代Javastring的最佳方法是什么?

目前我正在使用类似于:

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

我不是很高兴这种方法,因为它创build了一个沉重的数组(让我们说textContent可以包含一本书)。

有没有更好的解决scheme来遍历一个String的行?

你可以使用:

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

并使用readLine()方法:

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

要添加Java 8的方式来解决这个问题:

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

诅咒你也可以使用System.lineSeparator()来分割,如果你确定文件是从同一个平台上运行的。

或者更好的使用streamapi更加agressiv与filter,地图和收集:

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

你可以使用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. } 

番石榴的Splitter运作良好。 特别是你可以删除空行

 Splitter splitter = Splitter.on(System.getProperty("line.separator")) .trimResults() .omitEmptyStrings(); for (String line : splitter.split(input)){ // do work here } 

那么java.util.Scanner类呢?

综上所述:

一个简单的文本扫描器,可以使用正则expression式分析原始types和string。

扫描器使用分隔符模式将input分为令牌,缺省情况下符合空格。 然后可以使用各种下一种方法将得到的令牌转换为不同types的值。

并注意你的情况:

扫描仪也可以使用除空格之外的分隔符。 这个例子从一个string中读取几个项目:

  String input = "1 fish 2 fish red fish blue fish"; Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*"); System.out.println(s.nextInt()); System.out.println(s.nextInt()); System.out.println(s.next()); System.out.println(s.next()); s.close(); 

使用带有StringReader参数的BufferedReader。 BufferedReader有一个方法readLine(),所以你可以逐行读取你的string。

  StringReader reader = new StringReader(myBigTextString); BufferedReader br = new BufferedReader(reader); String line; while((line=br.readLine())!=null) { //do what you want } 

组合java.io.StringReaderjava.io.LineNumberReader

实际上,您可以使用Scanner来让您使用正常for循环:

 import java.util.Scanner; public class IterateLines { public static void main(String[] args) { Iterable<String> sc = () -> new Scanner("foo bar\nbaz\n").useDelimiter("\n"); for (String line: sc) { System.out.println(line); } } } 

给我们:

 $ javac IterateLines.java && java IterateLines foo bar baz