我需要为单个文件编写大小从1MB到2MB的字节数组。数据总是作为byte [](它被计算)分配,所以我不能使用FileChannel.transferTo。在写入之后,应该保证刷新到磁盘。
这是最快的解决方案吗?
FileChannel channel = new RandomAccessFile(file, "rw").getChannel();
ByteBuffer buffer = channel.map(FileChannel.MapMode.READ_WRITE, 0, data.length);
buffer.put(data);
channel.force(false);
channel.close();
在我的测试套件中,我发现当我进行清理时,文件有时会被操作系统(或JVM)锁定(java.io.File.delete()返回false)。我担心资源没有被释放。人们建议使用System.gc()以及一些不安全的解决方案,但也许我的程序可能会达到最大限制?我应该担心吗?分配大量内存映射文件会有问题吗?它来自同一个线程,因此在打开新的之前它们将被关闭。我的程序也必须能够删除这些文件。
另请阅读How to unmap a file from memory mapped using FileChannel in java?