我创建了一个方法,根据文件的行号从文件中读取特定行。它适用于大多数文件但是当我尝试读取包含大量非常长的行的文件时,则需要很长时间,特别是当它在文件中进一步缩小时。我也做了一些调试,它似乎也需要很多内存,但我不确定这是否可以改进。我知道还有其他一些问题关注如何从文件中读取某些行,但这个问题主要集中在性能方面。
public static final synchronized List<String> readLines(final File file, final Integer start, final Integer end) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
List<String> lines = new ArrayList<>();
try {
String line = bufferedReader.readLine();
Integer currentLine = 1;
while (line != null) {
if ((currentLine >= start) && (currentLine <= end)) {
lines.add(line + "\n");
}
currentLine++;
if (currentLine > end) {
return lines;
}
line = bufferedReader.readLine();
}
} finally {
bufferedReader.close();
}
return lines;
}
如何优化此方法比光更快?
答案 0 :(得分:0)
我意识到我之前所做的事情本来就很慢并耗尽了太多的记忆。
通过将所有行添加到内存然后处理List
中的所有行,它不仅需要两倍的时间,而且还无缘无故地创建String
个变量。
我现在正在使用Java 8 Stream
并在阅读时进行处理,这是迄今为止我使用过的最快的方法。
Path path = Paths.get(file.getAbsolutePath());
Stream<String> stream = Files.lines(path, StandardCharsets.UTF_8);
for (String line : (Iterable<String>) stream::iterator) {
//do stuff
}
}