Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java最快字节数组文件写入+;确保释放文件句柄_Java_Nio - Fatal编程技术网

Java最快字节数组文件写入+;确保释放文件句柄

Java最快字节数组文件写入+;确保释放文件句柄,java,nio,Java,Nio,我需要将大量大小从1MB到2MB的字节数组写入单个文件。数据始终分配为字节[](已计算),因此我无法使用FileChannel.transferTo。写入后,应保证将其刷新到磁盘 这是最快的解决方案吗 FileChannel channel = new RandomAccessFile(file, "rw").getChannel(); ByteBuffer buffer = channel.map(FileChannel.MapMode.READ_WRITE, 0, data.length)

我需要将大量大小从1MB到2MB的字节数组写入单个文件。数据始终分配为字节[](已计算),因此我无法使用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()和一些不安全的解决方案,但也许我的程序会达到最大限制?我应该担心吗?分配大量内存映射文件会有问题吗?它来自同一个线程,因此它们将在打开新线程之前关闭。此外,我的程序必须能够删除这些文件


也请阅读

做一些基准测试,看看什么是最快的。从FileOutputStream.write()开始,看看BufferedOutputStream是否可以做得更好,依此类推。我不会立即跳转到mmap文件。你能检查一下谁/什么文件被锁定了吗?您可以始终在退出时使用delete(如果进程没有持续运行),我已经进行了基准测试,FileOutputStream+BufferedOutputStream速度较慢。但是我担心被锁定的文件。如果内存中有所有字节数组,并且可以直接用FileOutputStream一次写入所有字节数组,则BufferedOutputStream会降低速度。如果文件长时间不打开,映射在java中不是很有效。在这种情况下,使用阻塞写入很可能是最好的选择。(如果您在最后使用fsync,那么不管您的写入速度有多快)