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

Posted

技术标签:

【中文标题】在文件作为 RandomAccessFile 打开并映射为 MappedByteBuffer 后重命名文件【英文标题】:Renaming file after it has been opened as a RandomAccessFile and mapped as a MappedByteBuffer 【发布时间】:2014-12-09 20:28:16 【问题描述】:

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

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

我怎么可能无法重命名作为 RandomAccessFile 打开的文件?

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

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);

【问题讨论】:

是因为文件仍然打开(我看到你关闭了)?在 Microsoft 的 Windows 上,您无法重命名打开的文件。 我刚刚注意到您将它重命名了两次,这很重要。 (“测试文件测试文件……”) 【参考方案1】:

文件仍处于打开状态。您必须先从内存中取消映射文件,然后才能重命名它。您可以在这里找到解决方案:How to unmap a file from memory mapped using FileChannel in java?

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

public static void unmap(MappedByteBuffer buffer)

   sun.misc.Cleaner cleaner = ((DirectBuffer) buffer).cleaner();
   cleaner.clean();

【讨论】:

以上是关于在文件作为 RandomAccessFile 打开并映射为 MappedByteBuffer 后重命名文件的主要内容,如果未能解决你的问题,请参考以下文章

java IO流 RandomAccessFile的使用

Java IO流RandomAccessFile类的使用

Java:RandomAccessFile随机访问文件

Java RandomAccessFile基本的用法

Java—IO流 RandomAccessFile类

Java基础——IO流4_随机访问文件流