是否有任何方法可以从文本文件中读取特定行?在API或Apache Commons中。 类似的东西:
String readLine(File file, int lineNumber)
我同意实施这一点很简单,但如果文件非常大,它的效率并不高。
答案 0 :(得分:17)
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。 效率我的意思是内存效率
答案 1 :(得分:5)
不是我知道的。
请注意,对于行开始的位置,文件没有特定的索引,因此任何实用程序方法都可以完全有效:
BufferedReader r = new BufferedReader(new FileReader(file));
for (int i = 0; i < lineNumber - 1; i++)
{
r.readLine();
}
return r.readLine();
(当然,有适当的错误处理和资源关闭逻辑)。
答案 2 :(得分:1)
如果您正在阅读的行 all 长度相同,那么计算可能会有用。
但是在线条长度不同的情况下,我认为没有其他方法可以一次读取它们,直到线数正确为止。
答案 3 :(得分:1)
不幸的是,除非你能保证文件中的每一行都是完全相同的长度,否则你将不得不读完整个文件,或者至少读到你所追踪的那一行。
计算行数的唯一方法是在文件中查找新的行字符,这意味着您将不得不读取每个字节。
可以优化您的代码,使其整洁可读,但在下面,您将始终阅读整个文件。
如果您要反复读取同一个文件,可以解析文件并创建一个存储某些行号偏移量的索引,例如行100,200等的字节数。
答案 4 :(得分:1)
因为文件是字节而不是面向行的 - 任何通用的解决方案复杂度最多都是O(n),n是文件大小(以字节为单位)。您必须扫描整个文件并计算行分隔符,直到您知道要读取的文件的哪一部分。
答案 5 :(得分:1)
guava有类似之处:
List<String> Files.readLines(File file, Charset charset);
所以你可以做到
String line = Files.readLines(file, Charsets.UTF_8).get(lineNumber);
答案 6 :(得分:1)
Using File Utils:
File fileFeatures = new File(
"Homework1AdditionalFiles/jEdit4.3/jEdit4.3ListOfFeatureIDs.txt");
String line = (String) FileUtils.readLines(fileFeatures).get(lineNumber);
答案 7 :(得分:0)
如果您打算以相同的方式使用同一文件(在特定行查找文本),则可以索引文件。行号 - &gt;偏移。
答案 8 :(得分:0)
根据这个answer,Java 8使我们能够从文件中提取特定行。答案中提供了示例。