所以我有这个相当简单的代码,我试图逐行读取文件:
if(new File(filesDir).listFiles() != null){
for(File file : new File(filesDir).listFiles()){
try {
Stream<String> stream = Files.lines(Paths.get(file.getAbsolutePath()));
for(int i = 0 ; i < stream.toArray().length; i++){
System.out.println(stream.toArray()[i]);
}
stream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
但是当它到达Sysout
时会抛出异常:
线程“main”中的异常java.lang.IllegalStateException:java.lang.IllegalStateException:stream已经被操作或关闭
引起:java.lang.IllegalStateException:流已经被操作或关闭
我发现的每个例子都使用Lambda表达式,我不认为这是唯一的方法,或者是它?
答案 0 :(得分:4)
Stream是使用循环的替代方法。您不能多次使用Stream。即使你可以多次使用一个流,每行输入两次调用toArray()
也会非常昂贵。
你能做的是
try (Stream<String> stream = Files.lines(file.toPath())) {
stream.forEach(System.out::println);
}
注意:使用此方法的一个显着优点是它可以在读取文件时打印文件。这意味着无论文件有多大,它仍然可以读取它。如果您对每行使用集合或数组,则您阅读的文件大小将受到您拥有的内存量的限制。