RandomAccessFile调用writeUTF写入文件时出现非打印字符问题
问题成因
你遇到的偏移量前置位置被非打印字符覆盖的问题,是RandomAccessFile的writeUTF()方法的固有逻辑导致的:writeUTF()并不会直接写入字符串的文本内容,而是会先写入2个字节的无符号整数表示后续字符串的字节长度,再写入对应UTF编码的字符串内容。你观察到的两个异常字符就是这两个长度标识字节。
修复方案
你可以按照以下步骤调整代码:
- 替换
writeUTF()调用,改用直接写入字符串字节的方式
把原有写入逻辑:
改为适配文件编码的字节写入逻辑(示例为UTF-8编码,可根据你的文件实际编码调整):writer.writeUTF(warpNames.get(i));// 需导入java.nio.charset.StandardCharsets byte[] strBytes = warpNames.get(i).getBytes(StandardCharsets.UTF_8); writer.write(strBytes); - 对齐新旧内容长度
由于你是覆盖原有内容,需要保证新写入的字符串长度和被替换的原有字符串长度完全一致:如果新字符串更短,末尾补空格占位;如果新字符串更长,截断到原有长度,避免出现原有内容残留或覆盖到无关内容的问题。 - 修正偏移量计算逻辑
你当前用Scanner.nextLine()读取行时,该方法会自动丢弃行尾的换行符,你计算offset时仅累加了ln.length(),没有计入换行符占用的1~2字节(Windows系统换行符为\r\n占2字节,Linux/macOS为\n占1字节),会导致实际定位的写入位置存在偏移,需要根据你的文件换行格式把对应长度加到offset计算逻辑中。
内容的提问来源于stack exchange,提问作者CProgrammer15
相关产品推荐
相关产品推荐

