使用Java读取文件给出起始行和结束行号

时间:2016-08-27 17:27:13

标签: java java-io

我是Java编程的新手,我无法在任何地方找到问题的答案。

如何读取文件的几行并将其存储在String(或字符串列表)中。

例如,从1000行的文件中,我只需要读取从第200行到第400行的200行。

我遇到FileInputStream使用它我们可以定义起始位置,但我们无法定义结束位置。

1 个答案:

答案 0 :(得分:8)

你不能直接这样做。你只能通过阅读并忽略你不关心的第一行来做到这一点。

你可以用Java LineNumberReader来做到这一点。用它来读取文件,一次读取一行。继续阅读并忽略行,直到你到达第200行,开始处理数据,一旦达到400就停止。

注意:在你提问之前,不,LineNumberReader#setLineNumber 更改文件位置,它只是人为地设置报告的行号:

  

默认情况下,行号从0开始。当读取数据时,此数字在每个行终止符处递增,并且可以通过调用setLineNumber(int)来更改。但请注意,setLineNumber(int)实际上并未更改流中的当前位置;它只会更改getLineNumber()返回的值。

另一个选择是只使用BufferedReader,调用readLine() 199次跳到第200行,然后读取下一个200(或其他)行。但是,LineNumberReader可以方便地跟踪您的行号。

自Java 8以来,第三个选择是使用streams API并执行以下操作:

Files.lines(Paths.get("input.txt"))
  .skip(200)   // skip to line 200
  .limit(200)  // discard all but the 200 lines following this
  .forEach(...)

将处理Consumer传递给forEach()

无论哪种方式,相同的概念:你必须阅读并丢弃文件的前N行,你无法解决这个问题。

LineNumberReader的示例:

LineNumberReader reader = new LineNumberReader(new FileReader("input.txt"));

for (String line = reader.readLine(); line != null; line = reader.readLine()) {
    if (reader.getLineNumber() > 400) {
        break; // we're done
    } else if (reader.getLineNumber() >= 200) {
        // do something with 'line'
    }
}

BufferedReader的示例,不像上面那样简单:

BufferedReader reader = new BufferedReader(new FileReader("input.txt"));

// skip to the 200th line
for (int n = 0; n < 199 && reader.readLine() != null; ++ n)
    ;

// process the next 201 (there's 201 lines between 200 and 400, inclusive)
String line;
for (int n = 0; n < 201 && (line = reader.readLine()) != null; ++ n) {
    // do something with 'line'
}

上面已经给出了使用Files的示例。

您希望如何组织条件并测试EOF等forwhile或任何循环更多是个人品味的问题,这些只是任意说明性示例。