You need to enable JavaScript to run this app. Java无Scanner实现文本数字整理为单列逐行存储遇运行异常求助
优惠活动
大模型
产品
解决方案
定价
更多

Java无Scanner实现文本数字整理为单列逐行存储遇运行异常求助

常见故障根因定位

目标文件被意外清空的原因

  • 初始化写入流时默认采用覆盖模式:只要执行了new FileWriter(目标路径, false),哪怕后续没有执行任何写操作,打开流的瞬间就会直接截断清空目标文件的原有内容。
  • 代码流程顺序错误:提前在主流程入口就初始化了BufferedWriter,哪怕后续读取源文件、解析数据的时候抛出了异常退出,写入流已经完成了文件清空操作,就会出现每次运行完目标文件就变空的现象。

数组越界异常的触发场景

  • 拆分字符串时未做格式兼容:直接对空行、带首尾逗号的行执行split(",")操作,拆分得到的数组长度和预设值不符,硬取下标位置时就会触发ArrayIndexOutOfBoundsException。
  • split方法未设置长度参数:默认的split行为会丢弃拆分结果末尾的空字符串,遇到格式不规范的输入行时,实际数组长度比预期少,也会触发下标越界。
符合作业要求的可运行实现

本实现全程不使用Scanner类,完全基于BufferedReader、BufferedWriter完成功能,同时内置了防清空、防越界的校验逻辑:

  • 调整代码执行顺序:先完成全量源文件读取、数据拆分校验,确认无异常后再打开写入流,从根源上避免提前清空目标文件的问题
  • 拆分逻辑做全场景兼容:对空行、首尾多余逗号、连续逗号的输入做过滤,不硬取固定数组下标,彻底消除数组越界的触发可能
import java.io.*;

public class CsvToSingleColumn {
    public static void main(String[] args) {
        // 可根据作业要求修改为实际的输入、输出文件路径
        File inputFile = new File("input.txt");
        File outputFile = new File("output.txt");

        // 第一阶段:完成源文件读取与数据解析,全部流程无异常再进入写入阶段
        StringBuilder resultBuffer = new StringBuilder();
        try (BufferedReader br = new BufferedReader(new FileReader(inputFile))) {
            String currentLine;
            while ((currentLine = br.readLine()) != null) {
                // 去除行首尾空白,跳过空行
                currentLine = currentLine.trim();
                if (currentLine.isEmpty()) continue;

                // 带-1参数的split不会丢弃末尾空串,避免拆分长度和预期不符
                String[] tokens = currentLine.split(",", -1);
                // 逐元素校验过滤,不固定取数组下标
                for (String token : tokens) {
                    token = token.trim();
                    if (token.isEmpty()) continue;
                    // 可根据作业要求调整数字格式校验规则
                    if (token.matches("-?\\d+")) {
                        resultBuffer.append(token).append(System.lineSeparator());
                    }
                }
            }
        } catch (IOException e) {
            System.err.println("源文件读取异常:" + e.getMessage());
            return;
        }

        // 第二阶段:解析全流程无异常,才打开写入流执行写操作
        try (BufferedWriter bw = new BufferedWriter(new FileWriter(outputFile))) {
            bw.write(resultBuffer.toString());
        } catch (IOException e) {
            System.err.println("目标文件写入异常:" + e.getMessage());
        }
    }
}

实现效果说明:程序运行后会自动把输入文件里所有逗号分隔的数字,逐行写入到输出文件中,形成单列存储的格式,全程不会触发提前清空目标文件、数组越界的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 05:06:03