是否有一种方法可以从文本文件中读取特定行?在API或Apache Commons中有类似以下的功能:
String readLine(File file, int lineNumber)
我同意它很容易实现,但是如果文件很大,它就不太有效率。
是否有一种方法可以从文本文件中读取特定行?在API或Apache Commons中有类似以下的功能:
String readLine(File file, int lineNumber)
我同意它很容易实现,但是如果文件很大,它就不太有效率。
String line = FileUtils.readLines(file).get(lineNumber);
虽然这样做可以,但它仍然存在效率问题。
或者,您可以使用:
LineIterator it = IOUtils.lineIterator(
new BufferedReader(new FileReader("file.txt")));
for (int lineNumber = 0; it.hasNext(); lineNumber++) {
String line = (String) it.next();
if (lineNumber == expectedLineNumber) {
return line;
}
}
由于缓冲区的存在,这将会稍微更加有效率。
查看Scanner.skip(..)
并尝试使用正则表达式跳过整行。我无法确定它是否更加有效率 - 进行基准测试。
P.S. 在此,效率指的是内存效率
我不知道。
请注意,文件中没有特定的索引来确定每行的起始位置,因此任何实用方法都与以下方法一样有效:
BufferedReader r = new BufferedReader(new FileReader(file));
for (int i = 0; i < lineNumber - 1; i++)
{
r.readLine();
}
return r.readLine();
guava有类似的东西:
List<String> Files.readLines(File file, Charset charset);
这样你就可以做到:
String line = Files.readLines(file, Charsets.UTF_8).get(lineNumber);
很遗憾,除非您能保证文件中的每一行都是完全相同的长度,否则您将不得不阅读整个文件,或者至少阅读到您需要的那一行。
您唯一能够计算行数的方法是在文件中查找换行符,这意味着您必须逐字节读取。
优化代码以使其整洁易读是可能的,但在底层,您始终会读取整个文件。
如果您要反复读取同一个文件,可以解析该文件并创建索引来存储某些行号的偏移量,例如第100行、第200行等的字节计数。
由于文件是按字节而不是按行定位的,因此任何通用解决方案的复杂度最多为O(n),其中n是文件大小(以字节为单位)。您必须扫描整个文件并计算行分隔符的数量,直到您知道要读取文件的哪个部分。
File fileFeatures = new File(
"Homework1AdditionalFiles/jEdit4.3/jEdit4.3ListOfFeatureIDs.txt");
String line = (String) FileUtils.readLines(fileFeatures).get(lineNumber);