Java写入文本文件内容从第224行而非开头开始的问题求助
核心原因
你遇到的写入位置偏移问题是代码逻辑设计导致的:
你的代码实现的是定长记录随机写入功能,写入位置由输入的客户号直接计算得到:fc.position((long) custNum * recordSize)。
程序启动时会先写入1000条空占位记录,每条记录对应一行,行号从1开始计数,而客户号从0开始计数,对应关系为:
- 客户号0 → 写入第1行
- 客户号n → 写入第n+1行
你现在每次写入都出现在第224行,说明你测试时输入的客户号固定为223,这完全符合当前代码的预期逻辑,不属于运行异常。如果需要调整为客户号1对应第1行,把位置计算逻辑修改为fc.position((long)(custNum - 1) * recordSize)即可。
其他隐藏风险点
- 定长记录长度计算有隐患:你当前用
String.length()获取字符长度作为recordSize,但字符串转字节数组的实际长度受系统默认编码影响,一旦出现中文等多字节字符,两者长度会不一致,直接导致写入位置偏移、相邻记录被覆盖。建议修改为按字节长度计算定长:final int recordSize = s.getBytes().length; - 文件初始化逻辑不完善:你当前用
CREATE参数创建输出流,如果目标文件已存在,不会清空原有内容,只会覆盖前1000条记录对应长度的内容,如果旧文件长度大于1000条记录的总长度,残留内容会留在文件尾部。建议初始化时增加清空参数:OutputStream output = new BufferedOutputStream(Files.newOutputStream(file, CREATE, TRUNCATE_EXISTING)); - 客户号输入缺少校验:你构造的定长记录要求客户号为3位,如果输入的客户号超过3位,会导致单条记录长度超过
recordSize,写入后会覆盖下一条记录的内容,建议增加校验逻辑,限制客户号输入范围为1~999。 - 如果你的实际需求是顺序写入、新内容直接追加到文件末尾,不需要按客户号修改指定位置的记录,那当前的随机写入逻辑完全不符合需求,可以直接去掉FileChannel相关逻辑,用BufferedWriter的append方法实现追加写入即可。
内容的提问来源于stack exchange,提问作者Thatman2
相关产品推荐
相关产品推荐

