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

使用Weka库读取.arff文件的Java代码报错求助

排查Java中使用Weka读取ARFF文件的代码错误

代码中的核心问题:

  • 提前返回导致核心逻辑未执行
    你在读取完数据集后立刻判断文件状态,满足条件就直接返回,后面的内容读取循环根本跑不起来。正确逻辑应该是先判断文件是否可读,再进行读取操作。

  • API使用错误

    • 拼写错误:appened应为append,但本质错误是ArffReader是读取工具,不能用来拼接内容,它没有提供拼接数据集的功能。
    • 错误调用br.getData():BufferedReader没有这个方法,而且ArffReader的getData()已经一次性读取了整个ARFF数据集,不需要循环读取。
  • 异常处理太模糊
    只返回"There is an error",无法知道是文件找不到、权限问题还是ARFF格式解析错误,应该捕获具体异常信息。

  • 冗余操作
    data.setClassIndex(...)是为后续机器学习操作准备的,如果你只是读取文件内容,这个步骤可以省略。

修正后的代码示例:

public String readArffFile(String filePath) {
    // 先校验文件状态
    File file = new File(filePath);
    if (!file.exists() || !file.isFile() || !file.canRead()) {
        return "文件不存在或不可读取";
    }

    // 使用try-with-resources自动关闭流,避免资源泄漏
    try (BufferedReader br = new BufferedReader(new FileReader(file))) {
        ArffReader arffReader = new ArffReader(br);
        Instances data = arffReader.getData();

        // 可选:如果后续需要做机器学习操作,再设置类索引
        // data.setClassIndex(data.numAttributes() - 1);

        // 将读取到的Instances转换为ARFF格式的字符串
        StringWriter stringWriter = new StringWriter();
        ArffWriter arffWriter = new ArffWriter(stringWriter, data);
        arffWriter.setFormat();
        arffWriter.writeHeader();
        arffWriter.writeBatch();

        return stringWriter.toString();
    } catch (IOException e) {
        return "IO错误: " + e.getMessage();
    } catch (Exception e) {
        return "ARFF文件解析错误: " + e.getMessage();
    }
}

修正说明:

  1. 调整逻辑顺序,先校验文件再读取,避免无效操作
  2. 用try-with-resources管理流资源,自动关闭文件流
  3. 使用ArffWriter将读取到的数据集转换回ARFF格式字符串,实现读取文件内容的需求
  4. 细化异常捕获,返回具体错误信息,方便排查问题
  5. 移除了原代码中的无效循环和错误API调用

内容的提问来源于stack exchange,提问作者nan27

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 07:15:06