java - Java FileChannel.size() vs File.length() - 在 FileChannel.truncate() 之后
问题描述
我正在考虑将这个问题变成我的情况。然后我决定我的情况需要自己的问题并希望得到答案。调用FileChannel.truncate()
以减小文件大小后,我调用FileChannel.size()
,关闭FileChannel
然后调用File.length()
. 该文件存在于整个操作中。 FileChannel.size()
总是准确的。在极少数情况下,File.length()
会返回之前的文件大小truncate()
。
这是显示情况的代码。
public static void truncate(File file, long size) throws IOException
{
FileChannel channel;
Path path;
long channelSize, fileLengthOpen, fileLengthClosed;
path = file.toPath();
channel = FileChannel.open(path, StandardOpenOption.READ, StandardOpenOption.WRITE, StandardOpenOption.CREATE);
try
{
channel.truncate(size);
channelSize = channel.size();
fileLengthOpen = file.length();
}
finally
{
channel.close();
}
fileLengthClosed = file.length();
if ((channelSize != size) || (fileLengthOpen != size) || (fileLengthClosed != size))
throw new IOException("The channel size or file length does not match the truncate size. Channel: " + channelSize + " - Open File: " + fileLengthOpen + " - Closed File: " + fileLengthClosed + " - Truncate: " + size);
}
在极少数情况下,代码会抛出IOException
. channelSize
==size
和fileLengthOpen
==size
但是fileLengthClosed
!= size
。
为什么fileLengthClosed
!= size
?如何确保File.length()
匹配FileChannel.size()
?只要不强制刷新文件的内容,刷新文件的元数据就可以了。刷新文件的内容会导致不需要的文件 I/O。
告诉我使用channelSize
或fileLengthOpen
忽略该问题的答案将不被接受。我有另一个类文件用于File.length()
确定文件的长度。传递channelSize
或传递fileLengthOpen
给另一个类需要将值向上传递堆栈几帧,然后再向下传递几帧。如果您建议我用它Files.size()
来解决问题,请解释原因。
我不确定这是否重要。我在 Linux 上运行 Java 10。(是的,我知道 Java 10 已经过时了,但在我能够实现升级到 Java 11 的必要功能之前,我一直坚持使用它。)
编辑:过去,文件的多线程更新会导致问题。为此,我创建了文件锁定机制,使得整个进程中只有1个线程可以独占操作一个文件(或者多个线程可以读取该文件)。此外,File
传递给 my 的对象truncate()
是由调用线程创建的,并且仅由该线程使用。我可以保证进程中没有其他线程可以对磁盘上的文件或File
对象进行操作。
编辑:我将代码更改为调用Files.size()
before 和 after channel.close()
。 channel.size()
,File.length()
并Files.size()
在打开时报告正确的尺寸channel
。紧随channel.close()
,File.length()
并且Files.size()
在极少数情况下是原始的较长文件长度,而不是截断的较短长度。
解决方案
旋转等待fileLengthClosed
是正确的。这是代码。
while (true)
{
fileLengthClosed = file.length();
if (fileLengthClosed == size)
break;
Thread.sleep(1);
}
我已经运行此代码 3 周,没有任何问题。file.length()
一个问题是在文件长度被修改或从不更新的情况下没有超时代码。
该解决方案首先没有回答为什么File.length()
不正确。此外,调用Thread.sleep()
表明我真的在等待其他一些操作完成,我真的应该强制该操作完成或阻止该操作。我不确定如何强制或阻止该操作。
推荐阅读
- javascript - 单击按钮时,每个循环应该只运行一次
- amazon-web-services - 使用带有 AWS S3 后端和 DynamoDb 状态锁的 Terraform 工作区
- python - Python:'inf 是 inf',但 '-inf 不是 -inf'?
- html - 如何使用 CSS 将文本放在交互式地图的一侧?
- python - 创建新列时 Pandas 的 apply() 和 Python 的 map() 之间的区别?
- javascript - 表单未通过 appendChild() 动态呈现
- javascript - 倒计时后的 HTML Javascript 重定向
- flutter - 使用颤振构建时,颤振终端/控制台充满“greyList API”异常
- reactjs - 如何使用 Yup 链接自定义验证
- javascript - 聚合匹配返回 null 与 $gte 和 $lt