FileChannel.truncate(long size) 是轻量截断操作,需以 WRITE 模式打开通道;size 为截断后字节数,设为 0 清空文件但保留 inode 和权限,大于当前大小则无变化,position 不影响截断行为。

用 FileChannel.truncate(long size) 可以直接修改文件逻辑长度,不删文件、不改权限、不丢 inode,是真正“缩小体积”的轻量操作。
必须以可写模式打开通道
truncate 是写操作,通道必须具备写权限,否则抛 NonWritableChannelException。
- ✅ 正确:用
StandardOpenOption.WRITE或组合如WRITE, CREATE打开 - ✅ 推荐:
FileChannel.open(path, WRITE)—— 自动处理文件存在性,且保证可写 - ❌ 错误:只用
READ打开后调用 truncate,必定失败
传入目标大小即可生效
参数 size 表示截断后的字节数,单位是字节,非负整数。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 设为
0:文件变为空,ls -l显示大小为 0,但文件仍存在、硬链接有效、权限不变 - 设为
1024:保留前 1024 字节,后续全部丢弃(逻辑上,不擦除磁盘块) - 设为大于当前 size 的值:无变化,不扩容,也不报错
注意 position 不影响截断行为
和 Python 的 file.truncate() 不同,Java 的 truncate() 总是从文件开头算起,与当前读写位置无关。
立即学习“Java免费学习笔记(深入)”;
- 即使
channel.position(1000),调用truncate(500)仍会裁掉第 500 字节之后所有内容 - 无需提前
position(0),也无需关心 MappedByteBuffer 是否刷新
配合 try-with-resources 安全使用
避免资源泄漏,同时建议前置校验路径可写性。
- 先调
Files.isWritable(path)确认权限 - 再用
try (FileChannel ch = FileChannel.open(path, WRITE)) { ch.truncate(0); } - 自动关闭,无需手动
close(),也不依赖 finally 块

















