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
相关产品推荐
相关产品推荐

