在文件作为 RandomAccessFile 打开并映射为 MappedByteBuffer 后重命名文件



我正在尝试重命名以前用作RandomAccessFile的文件。

当我尝试重命名文件时,我在重命名调用时出现错误。当我使用 Windows 应用程序进程监视器时,我看到没有重命名调用。

我怎么可能不能重命名作为随机访问文件打开的文件?

以下代码将复制我遇到的问题:

File f = new File("testfile.txt");
FileChannel fc = new RandomAccessFile(f, "rw").getChannel();
MappedByteBuffer mem = fc.map(FileChannel.MapMode.READ_WRITE, 0, 8);
mem.position(0);
fc.close();
File oldfile = new File("testfile.txt");
File newName = new File("testfile2.txt");
Boolean success = oldfile.renameTo(newName);
success = f.renameTo(newName);

文件仍处于打开状态。必须先从内存中取消映射文件,然后才能对其进行重命名。您可以在此处找到解决方案:如何在 java 中使用 FileChannel 从映射的内存中取消映射文件?

例如(此方法可能很危险):

public static void unmap(MappedByteBuffer buffer)
{
   sun.misc.Cleaner cleaner = ((DirectBuffer) buffer).cleaner();
   cleaner.clean();
}

最新更新