当前位置: 主页 > JAVA语言

java读取文件内容-java根据关键字读取文件内容

发布时间:2023-02-12 22:16   浏览次数:次   作者:佚名

Java如何逐行读取文件

本文翻译自How to read a file line by line in Java

有时我们想逐行读取文件来处理内容。 一个很好的例子是逐行读取 CSV 文件java读取文件内容,然后用逗号 (,) 将其拆分成列。

在 Java 中,当您需要逐行读取文件时,有多种选项可供选择。

1.扫描仪

Scanner 类提供了在 Java 中逐行读取文件的最简单方法。 我们可以使用 Scanner 类打开文件,然后逐行读取其内容。

Scanner 程序使用定界符模式将其输入分解为标记,在本例中为换行符:

try {
    // open file to read
    Scanner scanner = new Scanner(new File("examplefile.txt"));
    // read until end of file (EOF)
    while (scanner.hasNextLine()) {
        System.out.println(scanner.nextLine());
    }
    // close the scanner
    scanner.close();
        
} catch (FileNotFoundException ex) {
    ex.printStackTrace();
}

复制

如果此扫描仪的输入中有另一行且没有推进文件读取位置,则 hasNextLine() 方法将返回 true。

要读取数据并移动到下一行,我们应该使用 nextLine() 方法。 此方法将扫描仪移动到当前行之后并返回当前行的剩余部分,不包括任何最后的行分隔符。 然后将读取位置设置为下一行的开头。

由于 nextLine() 方法继续在输入中搜索行分隔符,如果不存在行分隔符,它可以缓冲所有要搜索的输入以跳过该行。

2. 缓冲阅读器

BufferedReader 类提供了一种从字符输入流中读取字符、数组和行的有效方法。

顾名思义,它最多可缓冲 8MB(或 8192KB)的字符,这对于大多数用例来说绰绰有余。 如果您正在读取的文件大于默认缓冲区大小,您可以自定义默认大小:

BufferedReader br = new BufferedReader(new FileReader(" foo.txt"), size);

复制

BufferedReader 构造函数接受一个 Reader 实例(例如 FileReader、InputStreamReader)作为字符输入流源。 这是一个简单的例子,展示了如何使用它逐行读取文件:

try {
    // create a reader instance
    BufferedReader br = new BufferedReader(new FileReader("examplefile.txt"));
    // read until end of file
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
    // close the reader
    br.close();
        
} catch (IOException ex) {
    ex.printStackTrace();
}

复制

readLine() 方法从文件中读取一行文本并返回包含该行内容的字符串,不包括任何行终止字符或空值。

注意:空值并不意味着字符串为空。 相反,它表示已到达文件末尾。

或者,您可以使用 BufferedReader 类中的 lines() 方法返回行流。 您可以轻松地将此流转换为列表或阅读:

try {
    // create a reader instance
    BufferedReader br = new BufferedReader(new FileReader("examplefile.txt"));
    // list of lines
    List list = new ArrayList<>();
    // convert stream into list
    list = br.lines().collect(Collectors.toList());
    // print all lines
    list.forEach(System.out::println);
    // close the reader
    br.close();
        
} catch (IOException ex) {
    ex.printStackTrace();
}

复制

3. Java 8 流

Java 8 Stream 是另一种(虽然更简洁)逐行读取文件的方式。 我们可以使用 Files.lines() 静态方法来初始化行流,如下所示:

try {
    // initialize lines stream
    Stream stream = Files.lines(Paths.get("examplefile.txt"));
    // read lines
    stream.forEach(System.out::println);
    // close the stream
    stream.close();
} catch (IOException ex) {
    ex.printStackTrace();
}

复制

4. 新的 I/O API

Java New I/O API 或 NIO(java.nio.* 包中的类)提供了 Files.readAllLines() 方法来将文本文件逐行读取到 List 中java读取文件内容,如下所示:

try {
    // read all lines
    List lines = Files.readAllLines(Paths.get("examplefile.txt"));
    // print all lines
    lines.forEach(System.out::println);
} catch (IOException ex) {
    ex.printStackTrace();
}

复制

5.随机访问文件

RandomAccessFile 类为读取和写入文件提供了一种非阻塞模式。 随机访问文件的行为类似于存储在文件系统中的大字节数组。

我们可以使用 RandomAccessFile 以读取模式打开文件,然后使用其 readLine() 方法逐行读取:

try {
    // open file in read mode
    RandomAccessFile file = new RandomAccessFile("examplefile.txt", "r");
    // read until end of file
    String line;
    while ((line = file.readLine()) != null) {
        System.out.println(line);
    }
    // close the file
    file.close();
        
} catch (IOException ex) {
    ex.printStackTrace();
}

复制

6.阿帕奇共享IO

Apache Commons IO 库包含实用程序类、流实现、文件过滤器、文件比较器等。 将以下内容添加到您的 build.gradle 文件以将库导入您的项目:

implementation 'commons-io:commons-io:2.6'

复制

如果您使用的是 Maven,请将以下内容添加到您的 pom.xml 文件中:


    commons-io
    commons-io
    2.6

复制

我们现在可以使用 FileUtils.readLines() (来自 Apache Commons IO 的静态方法)将文件中的所有行读取到一个列表中:

try {
    // read all lines of a file
    List lines = FileUtils.readLines(Paths.get("examplefile.txt").toFile(), "UTF-8");
    // process the lines
    for (String line : lines) {
        System.out.println(line);
    }
} catch (IOException ex) {
    ex.printStackTrace();
}

复制

由于 Apache Commons IO 一次读取文件中的所有行,因此这可能不是读取大文件的好解决方案。 在上面的例子中,它将继续阻塞 for 循环的执行,直到所有的行都被添加到 lines 对象中。

7.奥基

Okie 是 Square 为 Android、Kotlin 和 Java 开发的另一个开源 I/O 库。 它补充了原生的 java.io 和 java.nio 包,使访问、保存和操作数据变得更加容易。

要在您的项目中导入 Okie,请将以下内容添加到您的 build.gradle 文件中:

implementation 'com.squareup.okio:okio:2.4.0'

复制

如果您使用的是 Maven,请将以下内容添加到您的 pom.xml 文件中:


    com.squareup.okio
    okio
    2.4.0

复制

现在,我们可以使用 Okio.source() 方法打开源流来读取文件。 返回的 Source 接口很小,用途有限。 Okie 提供了 BufferedSource 类来将源用缓冲区包装起来,从而使程序运行得更快。

让我们举个例子:

try {
    // open a source stream
    Source source = Okio.source(Paths.get("examplefile.txt").toFile());
    // wrap stream with a buffer
    BufferedSource bs = Okio.buffer(source);
    // read until end of file
    String line;
    while ((line = bs.readUtf8Line()) != null) {
        System.out.println(line);
    }
    // close the stream
    source.close();
} catch (IOException ex) {
    ex.printStackTrace();
}

复制

readUtf8Line() 方法读取数据直到下一个行分隔符 – \n、\r\n 或文件末尾。 它将数据作为字符串返回,省略末尾的定界符。 当遇到空行时,该方法返回一个空字符串。 如果没有更多数据可读,它将返回 null。

延伸阅读

您可能对其他 Java I/O 文章感兴趣:

最后更新:2020 年 2 月 18 日

你也许也喜欢...