21

有什么方法可以从文本文件中读取特定行吗?在 API 或 Apache Commons 中。就像是 :

String readLine(File file, int lineNumber)

我同意实现起来很简单,但是如果文件很大,它的效率就不是很高。

4

9 回答 9

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(..)并尝试跳过整行(使用正则表达式)。我不知道它是否会更有效 - 对其进行基准测试。

PS与效率我的意思是内存效率

于 2010-01-26T09:17:42.140 回答
5

不是我知道的。

请注意,文件上没有关于行开始位置的特定索引,因此任何实用程序方法都将与以下内容一样有效:

BufferedReader r = new BufferedReader(new FileReader(file));
for (int i = 0; i < lineNumber - 1; i++)
{
   r.readLine();
}
return r.readLine();

(当然,具有适当的错误处理和资源关闭逻辑)。

于 2010-01-26T09:18:48.997 回答
1

因为文件是字节而不是面向行的 - 任何通用解决方案的复杂性最多为 O(n),其中 n 是文件大小(以字节为单位)。您必须扫描整个文件并计算行分隔符,直到您知道要读取文件的哪个部分。

于 2010-01-26T09:20:14.973 回答
1

番石榴有类似的东西:

List<String> Files.readLines(File file, Charset charset);

所以你可以做

String line = Files.readLines(file, Charsets.UTF_8).get(lineNumber);
于 2010-01-26T09:21:35.993 回答
1

如果您正在阅读的行的长度相同,那么计算可能会很有用。

但是在线条长度不同的情况下,我认为在行数正确之前,没有其他方法可以一次读取它们。

于 2010-01-26T09:18:02.373 回答
1

不幸的是,除非您可以保证文件中的每一行都是完全相同的长度,否则您将不得不通读整个文件,或者至少阅读您所追求的那一行。

计算行数的唯一方法是在文件中查找换行符,这意味着您将不得不读取每个字节。

可以优化您的代码以使其简洁易读,但在下面您将始终阅读整个文件。

如果您要一遍又一遍地读取同一个文件,您可以解析该文件并创建一个索引来存储某些行号的偏移量,例如第 100 行、第 200 行等的字节数。

于 2010-01-26T09:19:59.403 回答
1

使用文件工具:

File fileFeatures = new File(
                "Homework1AdditionalFiles/jEdit4.3/jEdit4.3ListOfFeatureIDs.txt");
String line = (String) FileUtils.readLines(fileFeatures).get(lineNumber);
于 2015-09-14T15:39:12.570 回答
0

如果您打算以相同的方式处理同一个文件(在某行查找文本),您可以为您的文件编制索引。行号 -> 偏移量。

于 2010-01-26T09:18:35.907 回答
0

根据这个答案,Java 8 使我们能够从文件中提取特定的行。该答案中提供了示例。

于 2016-04-12T19:32:25.573 回答