Java - 逐行读取txt文件

时间:2016-04-21 21:25:27

标签: java lambda java-8 nio java-stream

所以我有这个相当简单的代码,我试图逐行读取文件:

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表达式,我不认为这是唯一的方法,或者是它?

1 个答案:

答案 0 :(得分:4)

Stream是使用循环的替代方法。您不能多次使用Stream。即使你可以多次使用一个流,每行输入两次调用toArray()也会非常昂贵。

你能做的是

try (Stream<String> stream = Files.lines(file.toPath())) {
    stream.forEach(System.out::println);
}

注意:使用此方法的一个显着优点是它可以在读取文件时打印文件。这意味着无论文件有多大,它仍然可以读取它。如果您对每行使用集合或数组,则您阅读的文件大小将受到您拥有的内存量的限制。