我使用大量数据文件,有时我只需要知道这些文件中的行数,通常我打开它们并逐行读取它们直到我到达文件末尾
我想知道是否有更聪明的方法来做到这一点
Stream的javadoc说明:
Streams有一个BaseStream.close()方法并实现AutoCloseable,但几乎所有的流实例实际上都不需要在使用后关闭.通常,只有源为IO通道的流(例如Files.lines(Path,Charset)返回的流)才需要关闭.大多数流都由集合,数组或生成函数支持,不需要特殊的资源管理.(如果流确实需要关闭,则可以在try-with-resources语句中将其声明为资源.)
因此,绝大多数情况下,人们可以在单行中使用Streams,collection.stream().forEach(System.out::println);但是对于Files.lines和其他资源支持的流,必须使用try-with-resources语句或泄漏资源.
这让我觉得容易出错并且不必要.因为Streams只能迭代一次,所以在我看来,没有一个迭代后Files.lines不应该关闭输出的情况,因此实现应该只是在任何终端操作结束时隐式调用close .我错了吗?
下面是我如何计算文本文件中的行数.只是想知道有没有其他方法这样做?
while(inputFile.hasNext()) {
a++;
inputFile.nextLine();
}
inputFile.close();
Run Code Online (Sandbox Code Playgroud)
我正在尝试将数据输入到数组中,我不想两次读取文本文件.
任何帮助/建议表示赞赏.
谢谢
我编写了一段代码来计算文件中的行数(我无法找到可以在IO类中实现这一点的内置方法).我的代码如下:
try {
while(!line.equals("null")) {
line = bufferedReader.readLine();
a = a + 1;
System.out.println(a + " " + line);
}
} catch (NullPointerException N) {}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,当变量'line'计算为"null"时,计数仍然增加.我明白为什么会这样; 在整个代码块运行之后,while语句才会检查条件,在这种情况下,'a'将再次增加.我考虑过的解决方案:
1)设置'a = -1',而我在此代码块之前当前有'a = 0'2)使用if语句在达到count变量之前打破循环.这是我修改代码块的方法:
try {
while(!line.equals("null")) {
line = bufferedReader.readLine();
if (line.equals("null")) {break;}
a = a + 1;
System.out.println(a + " " + line);
}
} catch (NullPointerException N) {}
Run Code Online (Sandbox Code Playgroud)
我上面的问题?(1)似乎太做作,而(2)似乎多余.我想看看是否有更好的方法来解决这个问题 - 感谢您的建议.
java ×4
java-8 ×2
count ×1
java-stream ×1
large-files ×1
line-numbers ×1
lines ×1
stream ×1
while-loop ×1