给定一个不太长的字符串,逐行阅读它的最佳方法是什么?
我知道你能做到:
BufferedReader reader = new BufferedReader(new StringReader(<string>));
reader.readLine();
另一种方法是获取eol上的子字符串:
final String eol = System.getProperty("line.separator");
output = output.substring(output.indexOf(eol + 1));
有没有其他更简单的方法呢?我对上面的方法没有问题,只是想知道你们中是否有人知道一些看起来更简单和更有效的方法?
发布于 2009-07-08 07:38:00
也可以使用String的split
方法:
String[] lines = myString.split(System.getProperty("line.separator"));
这为您提供了一个方便的数组中的所有行。
我不知道split的表现如何。它使用正则表达式。
发布于 2009-07-08 07:36:08
还有Scanner
。您可以像使用BufferedReader
一样使用它
Scanner scanner = new Scanner(myString);
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
// process the line
}
scanner.close();
我认为这种方法比两种建议的方法都要干净一些。
发布于 2014-11-02 18:12:03
因为我对效率的角度特别感兴趣,所以我创建了一个小测试类(如下所示)。5,000,000行结果:
Comparing line breaking performance of different solutions
Testing 5000000 lines
Split (all): 14665 ms
Split (CR only): 3752 ms
Scanner: 10005
Reader: 2060
像往常一样,确切的时间可能会有所不同,但无论我运行它的频率如何,这个比率都是正确的。
结论: OP的“更简单”和“更高效”的需求不可能同时得到满足,split
解决方案(无论是哪一种实现)都更简单,但是Reader
实现无疑要比其他实现更好。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* Test class for splitting a string into lines at linebreaks
*/
public class LineBreakTest {
/** Main method: pass in desired line count as first parameter (default = 10000). */
public static void main(String[] args) {
int lineCount = args.length == 0 ? 10000 : Integer.parseInt(args[0]);
System.out.println("Comparing line breaking performance of different solutions");
System.out.printf("Testing %d lines%n", lineCount);
String text = createText(lineCount);
testSplitAllPlatforms(text);
testSplitWindowsOnly(text);
testScanner(text);
testReader(text);
}
private static void testSplitAllPlatforms(String text) {
long start = System.currentTimeMillis();
text.split("\n\r|\r");
System.out.printf("Split (regexp): %d%n", System.currentTimeMillis() - start);
}
private static void testSplitWindowsOnly(String text) {
long start = System.currentTimeMillis();
text.split("\n");
System.out.printf("Split (CR only): %d%n", System.currentTimeMillis() - start);
}
private static void testScanner(String text) {
long start = System.currentTimeMillis();
List<String> result = new ArrayList<>();
try (Scanner scanner = new Scanner(text)) {
while (scanner.hasNextLine()) {
result.add(scanner.nextLine());
}
}
System.out.printf("Scanner: %d%n", System.currentTimeMillis() - start);
}
private static void testReader(String text) {
long start = System.currentTimeMillis();
List<String> result = new ArrayList<>();
try (BufferedReader reader = new BufferedReader(new StringReader(text))) {
String line = reader.readLine();
while (line != null) {
result.add(line);
line = reader.readLine();
}
} catch (IOException exc) {
// quit
}
System.out.printf("Reader: %d%n", System.currentTimeMillis() - start);
}
private static String createText(int lineCount) {
StringBuilder result = new StringBuilder();
StringBuilder lineBuilder = new StringBuilder();
for (int i = 0; i < 20; i++) {
lineBuilder.append("word ");
}
String line = lineBuilder.toString();
for (int i = 0; i < lineCount; i++) {
result.append(line);
result.append("\n");
}
return result.toString();
}
}
https://stackoverflow.com/questions/1096621
复制相似问题