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

时间:2014-12-09 20:28:17

标签: java java-io randomaccessfile mappedbytebuffer

我正在尝试重命名之前用作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);

1 个答案:

答案 0 :(得分:1)

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

例如(此方法可以是dangeraus):

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