FileWriter在追加模式下不支持seek定位,因其无seek()方法且仅顺序写入;需随机访问应使用RandomAccessFile,手动调用seek()实现定位与读写。

FileWriter 在追加模式(append = true)下不支持 seek 指针定位,调用 seek() 会抛出 IOException 或直接被忽略——因为 FileWriter 本身没有 seek() 方法,它也不具备随机访问能力。
FileWriter 本质是顺序写入流
FileWriter 是字符流,底层封装了 FileOutputStream,设计目标是文本写入。它只提供 write(char[])、write(String) 等方法,没有 seek()、getChannel() 或文件指针控制接口。所谓“追加模式”,仅表示构造时传入 true 后,所有写入操作自动定位到文件末尾,且每次写都追加,不会覆盖已有内容。
- 构造方式:
new FileWriter("a.txt", true)→ 写入总在末尾 - 无法跳转:没有
seek()方法,也不能通过反射或包装强行移动指针 - 底层行为:实际委托给 FileOutputStream(append 模式),而后者也禁止中途定位
想实现“追加 + 定位”,得换 RandomAccessFile
如果既要追加写入,又需要中间某处读取或修改,FileWriter 不适用。必须改用 RandomAccessFile,并手动控制指针:
-
raf.seek(raf.length())→ 定位到末尾,等效追加 -
raf.seek(100)→ 跳到第 100 字节,可读/可覆盖写 - 注意编码:写字符串要用
writeUTF()或writeBytes(),避免字节错位
常见误区澄清
有人误以为 FileWriter 和 RandomAccessFile 都能 seek,或试图用 BufferedWriter 包装后调用 seek —— 这些都无效:
立即学习“Java免费学习笔记(深入)”;
-
BufferedWriter没有 seek 方法,它的缓冲区只是加速写,不改变底层限制 -
FileWriter的 append 模式是“一次性开关”,不是运行时可切换的定位策略 - 若需混合操作(如读头部 + 追加日志),建议分开处理:用
RandomAccessFile读+改,再用FileWriter(true)单独追加
真正需要随机定位和灵活写入时,FileWriter 就该让位给 RandomAccessFile。它不是缺陷,而是职责分工明确的结果。


















