Java读取大型双列数据文件失败问题求助
问题分析与解决方案
你的代码无法读取文件的核心原因是数据为逗号分隔的CSV格式,但Scanner默认仅以空白字符作为分隔符,逗号会被识别为数字的一部分,导致hasNextDouble()无法检测到有效数值,循环直接跳过。
修复步骤
1. 调整Scanner分隔规则
添加一行代码,让Scanner同时将逗号和空白字符视为分隔符:
scan.useDelimiter("[,\\s]+");
该正则表达式表示匹配逗号或任意数量的空白字符,能正确拆分每行的两个数值。
2. 增加文件存在性校验
避免因路径错误导致读取失败,在创建Scanner前加入判断:
if (!bean.exists()) { System.err.println("文件不存在,请检查路径"); return; }
3. 优化资源管理(可选)
使用try-with-resources语法自动关闭Scanner,防止资源泄漏:
修改后的完整代码
import java.util.Scanner; import java.io.File; class Main { public static void main(String[] args) throws Exception { File bean = new File("BeanDataset.txt"); // 检查文件是否存在 if (!bean.exists()) { System.err.println("文件不存在,请检查路径"); return; } // try-with-resources自动关闭Scanner try (Scanner scan = new Scanner(bean)) { // 设置分隔符:逗号或任意空白字符 scan.useDelimiter("[,\\s]+"); double[] minor = new double[13611]; double[] major = new double[13611]; int current = 0, minorcount=0, majorcount=0; while(scan.hasNextDouble()) { double num = scan.nextDouble(); if(current==0) { minor[minorcount] = num; minorcount++; current = 1; } else { major[majorcount] = num; majorcount++; current = 0; } System.out.println(num); } // 可选:验证读取数据量是否符合预期 System.out.println("已读取minor数据量:" + minorcount); System.out.println("已读取major数据量:" + majorcount); } } }
额外说明
- 如果文件编码非系统默认编码,可指定编码格式,例如
new Scanner(bean, "UTF-8") - 若数据行数可能变动,建议用
ArrayList<Double>替代固定长度数组,避免越界或空间浪费
内容的提问来源于stack exchange,提问作者Liam Horton
相关产品推荐
相关产品推荐

