Java如何逐行读取文本文件内容?

在以下代码示例中,您将学习如何使用Apache CommonsFileUtils.lineIterator()方法逐行读取文件内容。一次读取一行文件的内容,进行一些处理,然后立即将其从内存中释放,将降低程序使用的内存消耗。

下面的代码段为您提供了该FileUtils.lineIterator()方法的基本用法。您传递要读取的文件和要使用的编码。一个Iterator文件中的线路将被退回。使用hasNext()方法查看是否有要从迭代器读取的行。nextLine()方法将为您提供文件的下一行。

完成迭代器后,我们需要使用LineIterator.close() 或 LineIterator.closeQuietly()方法将其关闭。

package org.nhooo.example.commons.io;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.LineIterator;

import java.io.File;
import java.net.URL;
import java.util.Objects;

public class ReadFileLineByLine {
    public static void main(String[] args) throws Exception {
        // 从资源目录加载文件。
        ClassLoader classLoader = ReadFileLineByLine.class.getClassLoader();
        URL url = Objects.requireNonNull(classLoader.getResource("data.txt"),
                "Resource could not be found.");

        File file = new File(url.getFile());
        try (LineIterator iterator = FileUtils.lineIterator(file, "UTF-8")) {
            while (iterator.hasNext()) {
                String line = iterator.nextLine();
                System.out.println("line = " + line);
            }
        }
    }
}

在上面的示例中,我们从资源目录加载文件。这就是为什么我们使用该ClassLoader.getResource()方法。如果要从绝对路径加载文件,则可以简单地创建一个File对象并将绝对路径传递给该文件。

Maven依赖

<!-- http://repo1.maven.org/maven2/commons-io/commons-io/2.6/commons-io-2.6.jar -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>