Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >如何在Java中逐行读取文件

如何在Java中逐行读取文件

作者头像
ccf19881030
发布于 2020-11-24 04:40:13
发布于 2020-11-24 04:40:13
10.5K00
代码可运行
举报
文章被收录于专栏:ccf19881030的博客ccf19881030的博客
运行总次数:0
代码可运行

如何在Java中逐行读取文件

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

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

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

1.Scanner

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

Scanner程序使用定界符模式将其输入分为令牌,在本例中为新行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
BufferedReader br = new BufferedReader(new FileReader(" foo.txt"), size);

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()方法从文件中读取一行文本,并返回一个包含该行内容的字符串,但不包括任何行终止字符或null。

注意:null值并不表示字符串为空。 而是表明已到达文件末尾。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
try {
    // create a reader instance
    BufferedReader br = new BufferedReader(new FileReader("examplefile.txt"));

    // list of lines
    List<String> 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 Stream

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
try {
    // initialize lines stream
    Stream<String> 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. New I/O API

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
try {
    // read all lines
    List<String> lines = Files.readAllLines(Paths.get("examplefile.txt"));

    // print all lines
    lines.forEach(System.out::println);

} catch (IOException ex) {
    ex.printStackTrace();
}

5. RandomAccessFile

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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. Apache Commons IO

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
implementation 'commons-io:commons-io:2.6'

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>

现在,我们可以使用FileUtils.readLines()(来自Apache Commons IO的静态方法)将文件中的所有行读取到List <String>中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
try {
    // read all lines of a file
    List<String> 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

Okie是由Square为AndroidKotlin和Java开发的另一个开源I/O库。 它补充了本机java.iojava.nio包,使访问,保存和处理数据变得更加容易。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
implementation 'com.squareup.okio:okio:2.4.0'

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>com.squareup.okio</groupId>
    <artifactId>okio</artifactId>
    <version>2.4.0</version>
</dependency>

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

让我们举个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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日 Java

您可能还喜欢…

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/11/14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何使用Java逐行读取大文本文件?
这是一个示例,该示例具有完整的错误处理并支持Java 7之前的字符集规范。使用Java 7,您可以使用try-with-resources语法,从而使代码更简洁。
用户7886150
2020/12/11
2.7K0
java 读取字符串文件_Java读取文件为字符串
有时在处理文件时,我们需要将文件读取为Java中的String。下面学习如何将文件读取到Java中的String的几种方法。
全栈程序员站长
2022/09/17
1.2K0
文本文件逐行处理–用java8 Stream流的方式
本文中为大家介绍使用java8 Stream API逐行读取文件,以及根据某些条件过滤文件内容
字母哥博客
2020/09/23
3.1K0
Java 读取文件
JAVA有多种读取文件的方式,其中比较深层次的原理在我的另外一篇文章分析过:JDK核心JAVA源码解析(5) - JAVA File MMAP原理解析,那么,我们有哪些方式去读取一个文件的内容呢?
干货满满张哈希
2021/04/12
4.1K0
JAVA读取csv文件_java读取csv文件某一列
当读取的是一个简单的csv文件,即文件的列字段中不包含分隔符时,可以使用BufferedReader或者Scanner类去读取
全栈程序员站长
2022/11/16
3.8K0
小师妹学JavaIO之:文件读取那些事
小师妹最新对java IO中的reader和stream产生了一点点困惑,不知道到底该用哪一个才对,怎么读取文件才是正确的姿势呢?今天F师兄现场为她解答。
程序那些事
2020/07/08
3680
2018-04-26 Java – Read File to String Examples三种方法把文件读成一个字符串
原文地址:(英文版) https://howtodoinjava.com/core-java/io/java-read-file-to-string-examples/ Learn to read file to string in java. Examples use Files.readAllBytes, Files.lines and FileReader & BufferedReader to read file content. 学习读取文件,并赋值到String中。 示例使用 Files.re
Albert陈凯
2018/05/04
1.7K0
总结java从文件中读取数据的6种方法-JAVA IO基础总结第二篇
在上一篇文章中,我为大家介绍了《5种创建文件并写入文件数据的方法》,本节我们为大家来介绍6种从文件中读取数据的方法.
字母哥博客
2020/09/23
3.7K0
总结java从文件中读取数据的6种方法-JAVA IO基础总结第二篇
java之的读取文件大全
java之的读取文件大全 使用java进行文件读写,因为使用的频率不高,加上写起来也没那么简单,经常容易忘记,然后就得去翻阅以前的笔记,或者找寻之前写的文件读写代码,这次决定好好的整理下这块的知识点,并写几个通用的工具类,简化文件读写的操作 本篇博文将以下面几个点作为研究对象 文件类型 普通文件读写 json文件读写 csv文件读写 xml文件读写 ini文件读写 properties文件读写 yaml 文件读写 读取方式 相对路径 绝对路径 互联网 jar包文件读取 编码 编码格式 1. 读写类介绍
一灰灰blog
2018/02/06
3.7K0
java之的读取文件大全
Java I/O流输入输出,序列化,NIO,NIO.2
Java IO流 File类: File类是java.io包下代表和平台无关的文件和目录,File不能访问文件内容本身。 File类基本操作: System.out.println("判断文件是否存在:"+file.exists());//判断文件是否存在,返回Boolean值 System.out.println("创建文件夹:"+file.mkdir());//创建文件夹,只能创建一层,返回Boolean值 System.out.println("文件目录
二十三年蝉
2018/07/05
1.5K0
Java 8文件操作全攻略:高效读写TXT文件与并发管理精解
hi,我是程序员王也,一个资深Java开发工程师,平时十分热衷于技术副业变现和各种搞钱项目的程序员~,如果你也是,可以一起交流交流。
王也518
2024/04/15
1.4K0
Java 8文件操作全攻略:高效读写TXT文件与并发管理精解
File API
Read文件 @Test public void readFileLinesToJson() { FileUtils.readFileLinesToJson("/mappings/doctorinfo_mapping.json"); } /** * 读取resource文件下的mapping * @param filePath * @return */ public static StringBuffer readFileLinesToJson(String filePath) {
HLee
2021/03/09
8130
File API
[Java]读取文件方法大全
1、按字节读取文件内容 2、按字符读取文件内容 3、按行读取文件内容 4、随机读取文件内容  public class ReadFromFile {     /**      * 以字节为单位读取文件,常用于读二进制文件,如图片、声音、影像等文件。      */     public static void readFileByBytes(String fileName) {         File file = new File(fileName);         InputStream in = 
hbbliyong
2018/03/05
8910
Java中实现顺序IO
对于磁盘的读写分为两种模式,顺序IO和随机IO。 随机IO存在一个寻址的过程,所以效率比较低。而顺序IO,相当于有一个物理索引,在读取的时候不需要寻找地址,效率很高。
付威
2020/02/17
6.2K15
Java之Reader:解析字符流,读取文件内容不再是难事!
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
喵手
2023/11/08
1.9K0
Java之Reader:解析字符流,读取文件内容不再是难事!
Java 编程问题:六、Java I/O 路径、文件、缓冲区、扫描和格式化
本章包括 20 个涉及文件 Java I/O 的问题。从操作、行走和观察流文件的路径,以及读/写文本和二进制文件的有效方法,我们将介绍 Java 开发人员可能面临的日常问题。
ApacheCN_飞龙
2022/07/11
2.6K0
java 的 io流 读取文件里面 的内容
eg. 假设文件file1.txt,采用字节流的话是这样读的: a中国bc张三fe 第一次读:一个字节,正好读到’a’ 第二次读:一个字节,正好读到’中’字符的一半。 第三次读:一个字节,正好读到’中’字符的另外一半。
一写代码就开心
2022/06/14
1.2K0
java 的 io流 读取文件里面 的内容
如何使用 Java 将 JSON 文件读取为字符串?这三种方法很管用!
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,它可以用来存储和传输结构化的数据。在 Java 中,有多种方法可以将 JSON 文件读取为字符串,本文将介绍其中的几种。
网络技术联盟站
2023/04/24
3.7K0
如何使用 Java 将 JSON 文件读取为字符串?这三种方法很管用!
Java实现文件复制常见方式
0x01:FileInputStream/FileOutputStream字节流进行文件的复制
BUG弄潮儿
2020/06/15
7130
在Node.js中如何逐行读取文件
本文翻译自How to read a file line by line in Node.js
ccf19881030
2020/10/29
13.7K0
相关推荐
如何使用Java逐行读取大文本文件?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文