You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 21:37:44