Java中读取TXT文件并解析结构化数据的教程
在实际开发中,我们经常会遇到需要处理TXT文本文件的场景,比如读取配置文件、解析日志数据或者处理用户上传的纯文本数据。很多TXT文件的内容并不是杂乱无章的,而是带有一定结构,比如每行用逗号分隔不同字段,或者固定长度划分字段内容。本文将介绍Java中读取TXT文件并解析这类结构化数据的完整实现方法。
准备示例TXT文件
首先我们准备一个带有结构化数据的TXT文件,假设文件名为user_data.txt,内容如下,每行代表一条用户数据,字段之间用逗号分隔,分别是用户ID、用户名、年龄、邮箱:
1001,张三,25,zhangsan@ipipp.com 1002,李四,28,lisi@ipipp.com 1003,王五,22,wangwu@ipipp.com
使用BufferedReader逐行读取文件
Java中读取文本文件最基础的方式是使用FileReader配合BufferedReader,这种方式可以逐行读取文件内容,处理起来比较灵活。下面的代码实现了读取TXT文件每一行内容的功能:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class TxtReaderDemo {
public static void main(String[] args) {
// TXT文件路径,可根据实际情况修改
String filePath = "user_data.txt";
// 存储读取到的每一行内容
List<String> lineList = new ArrayList<>();
// 使用try-with-resources自动关闭资源,避免资源泄露
try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
String line;
// 逐行读取,readLine()返回null表示文件读取完毕
while ((line = br.readLine()) != null) {
// 跳过空行
if (!line.trim().isEmpty()) {
lineList.add(line);
}
}
System.out.println("共读取到" + lineList.size() + "行有效数据");
} catch (IOException e) {
System.err.println("读取文件失败:" + e.getMessage());
e.printStackTrace();
}
}
}上面的代码中,我们通过BufferedReader的readLine()方法逐行读取文件,将非空行存入集合,同时用try-with-resources语法确保流在使用完毕后自动关闭,不需要手动调用close()方法。
解析逗号分隔的结构化数据
读取到每行内容后,我们需要根据结构规则解析出每个字段。针对上面的逗号分隔数据,我们可以使用String类的split()方法分割字符串,再转换成对应的数据类型。下面的代码在之前的基础上增加了数据解析的逻辑:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
// 定义用户实体类,存储解析后的结构化数据
class User {
private int id;
private String name;
private int age;
private String email;
public User(int id, String name, int age, String email) {
this.id = id;
this.name = name;
this.age = age;
this.email = email;
}
@Override
public String toString() {
return "User{id=" + id + ", name='" + name + "', age=" + age + ", email='" + email + "'}";
}
}
public class TxtParserDemo {
public static void main(String[] args) {
String filePath = "user_data.txt";
List<User> userList = new ArrayList<>();
try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
String line;
int lineNum = 0;
while ((line = br.readLine()) != null) {
lineNum++;
// 跳过空行
if (line.trim().isEmpty()) {
continue;
}
// 按逗号分割字段,注意如果字段中包含逗号需要特殊处理,这里简化场景
String[] fields = line.split(",");
// 校验字段数量是否正确
if (fields.length != 4) {
System.err.println("第" + lineNum + "行数据格式错误,字段数量不足:" + line);
continue;
}
try {
int id = Integer.parseInt(fields[0].trim());
String name = fields[1].trim();
int age = Integer.parseInt(fields[2].trim());
String email = fields[3].trim();
// 可以添加邮箱格式校验,这里简化为非空校验
if (email.isEmpty()) {
System.err.println("第" + lineNum + "行邮箱为空:" + line);
continue;
}
User user = new User(id, name, age, email);
userList.add(user);
} catch (NumberFormatException e) {
System.err.println("第" + lineNum + "行数据类型转换失败:" + line);
}
}
System.out.println("成功解析" + userList.size() + "条用户数据:");
for (User user : userList) {
System.out.println(user);
}
} catch (IOException e) {
System.err.println("读取文件失败:" + e.getMessage());
e.printStackTrace();
}
}
}这段代码首先定义了一个User实体类,用来存储解析后的用户数据。在解析过程中,我们做了简单的格式校验:校验每行的字段数量是否为4,校验数字类型的字段是否能正常转换,跳过不符合规则的行,避免单次解析错误导致整个程序崩溃。
使用NIO的Files类简化读取操作
Java 8之后引入的NIO包中的Files类提供了更简洁的文件读取方式,我们可以用Files.readAllLines()方法一次性读取所有行,代码更加简洁:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
public class NioTxtReader {
public static void main(String[] args) {
String filePath = "user_data.txt";
try {
// 读取所有行,默认使用UTF-8编码,如果文件是其他编码需要指定
List<String> lines = Files.readAllLines(Paths.get(filePath));
System.out.println("共读取到" + lines.size() + "行数据");
for (String line : lines) {
System.out.println("读取到内容:" + line);
}
} catch (IOException e) {
System.err.println("读取文件失败:" + e.getMessage());
e.printStackTrace();
}
}
}需要注意的是,Files.readAllLines()方法会将所有内容一次性加载到内存中,如果TXT文件非常大,可能会导致内存溢出,这种场景下还是建议使用BufferedReader逐行读取的方式。
处理不同编码的TXT文件
实际场景中TXT文件的编码可能不是默认的UTF-8,比如Windows系统生成的部分TXT文件可能是GBK编码。这时候我们可以在读取时指定对应的编码,避免乱码问题。下面是使用BufferedReader指定GBK编码读取的示例:
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
public class CharsetTxtReader {
public static void main(String[] args) {
String filePath = "user_data.txt";
// 指定文件编码为GBK,如果是UTF-8可以替换为StandardCharsets.UTF_8
Charset charset = Charset.forName("GBK");
try (BufferedReader br = new BufferedReader(
new InputStreamReader(new FileInputStream(filePath), charset))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
System.err.println("读取文件失败:" + e.getMessage());
e.printStackTrace();
}
}
}如果是使用Files类读取,也可以指定编码:Files.readAllLines(Paths.get(filePath), Charset.forName("GBK")),这样就能正确读取对应编码的TXT文件内容。
常见注意事项
- 读取文件前最好先校验文件是否存在、是否有读取权限,避免抛出无意义的异常。
- 解析结构化数据时,要根据实际数据格式调整分割规则,比如如果字段中包含逗号,就不能直接用
split(","),可以考虑使用正则匹配或者第三方CSV解析库。 - 生产环境中建议对文件路径、解析规则等做配置化处理,不要硬编码在代码中,方便后续维护。
- 处理大文件时优先选择流式读取,避免一次性加载大量数据到内存。
Java读取TXT文件解析结构化数据BufferedReader逗号分隔文件编码修改时间:2026-05-24 12:21:19