Java中截断文件或写入空字节数组后,被移除字节的状态问询
关于Java中文件截断后被移除字节的去向问题
先直接点破你代码的实际效果:这段代码会把原本1MB的文件直接截断为0字节——因为new FileOutputStream(file)这个构造器在处理已存在的文件时,默认会先清空文件(把文件长度设为0),之后再执行写入操作。哪怕你只写了一个空字节数组,这个清空截断的动作已经完成了。
接下来逐个解答你的疑问:
被“移除”的字节会发生什么?
这些原本属于文件的字节数据会被文件系统标记为“未使用”的磁盘空间,后续系统或其他应用可以直接复用这块空间来存储新数据。它们是否仍存在于文件系统中?是否仍与文件关联?
从文件的角度来说,这些字节已经和原文件完全脱离关系了——文件系统不会再把它们和你的这个文件挂钩,也不会保留什么“标记”指向它们。不过有个例外:如果你的文件系统开启了快照、版本历史这类额外功能(比如部分NAS的快照、Mac的Time Machine),这些旧数据可能会在快照里保留一段时间,但这是文件系统的特性,和Java的这次写入操作无关。这和直接删除文件有区别吗?
当然有区别:- 截断文件:文件本身还会保留在目录里,只是文件长度变成了0,原来的数据块被释放为可用空间。
- 删除文件:文件的目录条目(也就是你在文件管理器里看到的文件名和它的索引信息)会被移除,文件从目录里消失,同样原来的数据块也会被标记为可用。
简单来说,截断是“留着空文件”,删除是“连文件带名字一起拿掉”。
最后补个小提示:如果不想触发截断行为,你应该用带追加参数的构造器:new FileOutputStream(file, true),这样打开文件时会直接跳到末尾,写入空数组也不会改变原文件的内容和长度。
内容的提问来源于stack exchange,提问作者user3964537
相关产品推荐
相关产品推荐

