
本文详解如何使用 java 的 bufferedreader 读取含多行整数的文本文件,并将其安全、高效地解析为 int[][] 二维数组,涵盖动态行数处理、异常防护与代码最佳实践。
本文详解如何使用 java 的 bufferedreader 读取含多行整数的文本文件,并将其安全、高效地解析为 int[][] 二维数组,涵盖动态行数处理、异常防护与代码最佳实践。
在实际开发中,常需从文本文件或标准输入读取结构化数值数据(如矩阵、坐标网格等),并将其构造成二维整型数组用于后续计算。本文以两行空格分隔的整数为例(如 "14 14 14 14" 和 "32 32 32 32"),提供一个健壮、可扩展的 Java 解决方案。
核心实现逻辑
关键在于:逐行读取 → 按空格切分 → 转换为 int → 动态构建二维数组。由于行数和列数均未知,我们采用“先读首行确定列数,再按行动态分配”的策略,避免硬编码维度。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
以下是完整、生产就绪的实现:
import java.io.*;
import java.util.Objects;
public static int[][] convertTo2DArray(String filename) {
Objects.requireNonNull(filename, "Filename must not be null");
try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {
String line;
int row = 0;
int[][] array = null;
while ((line = reader.readLine()) != null) {
line = line.trim();
if (line.isEmpty()) continue; // 跳过空行,增强鲁棒性
String[] tokens = line.split("\s+"); // 使用正则 \s+ 处理多个空格/制表符
int cols = tokens.length;
// 首次读取:初始化二维数组(行数暂不确定,先按需扩容)
if (array == null) {
array = new int[1][cols]; // 初始分配 1 行
} else if (row >= array.length) {
// 动态扩容:创建新数组,复制已有数据
int[][] newArray = new int[array.length * 2][cols];
System.arraycopy(array, 0, newArray, 0, array.length);
array = newArray;
}
// 解析当前行整数
array[row] = new int[cols];
for (int i = 0; i <h3>使用示例</h3><pre class="brush:php;toolbar:false;">// 假设文件 data.txt 内容为:
// 14 14 14 14
// 32 32 32 32
String path = "data.txt";
int[][] matrix = convertTo2DArray(path);
// 输出验证
for (int i = 0; i <h3>注意事项与最佳实践</h3>
- ✅ 空行与空白符处理:使用 trim() 和 \s+ 分割,兼容多余空格、制表符及空行;
- ✅ 异常防御:对 NumberFormatException 和 FileNotFoundException 进行明确封装,便于调试与调用方处理;
- ✅ 内存优化:动态扩容机制避免预估错误导致的内存浪费,最终截断保证数组紧凑;
- ⚠️ 列数一致性校验(可选增强):若业务要求每行列数必须相同,可在首次读取后校验后续每行 tokens.length == cols,不一致时抛出异常;
- ? 替代方案提示:对于小规模数据或已知尺寸,也可使用 Scanner 或 Java 8+ 的 Stream API(如 Files.lines().map(...)),但 BufferedReader 在性能与可控性上更优。
该方案兼顾简洁性、健壮性与可维护性,适用于配置文件解析、算法输入读取、测试数据加载等典型场景。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










