我是Java编程的新手,我无法在任何地方找到问题的答案。
如何读取文件的几行并将其存储在String
(或字符串列表)中。
例如,从1000行的文件中,我只需要读取从第200行到第400行的200行。
我遇到FileInputStream
使用它我们可以定义起始位置,但我们无法定义结束位置。
答案 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等for
或while
或任何循环更多是个人品味的问题,这些只是任意说明性示例。