https://blog.csdn.net/qq_41158114/article/details/134333421
https://blog.csdn.net/m0_66490875/article/details/136053145
https://gitee.com/ninesuntec/large-file-upload
https://blog.csdn.net/zhiyikeji/article/details/128183552?spm=1001.2014.3001.5501
https://cloud.tencent.com/developer/article/2144682
视频
https://gitee.com/crzzx/video-play-demo
RandomAccessFile
和 MappedByteBuffer
都是 Java 提供的用于文件操作的工具,但它们在实现机制和用途上有所不同。 以下是它们之间的主要区别:
- 实现机制:
RandomAccessFile
:它是一个独立的类,可以随机访问文件的任意位置。RandomAccessFile
对象包含一个记录当前位置的文件指针,通过 seek 方法可以改变指针的位置。它直接与文件系统交互,读写操作是通过 Java 的 I/O 类进行的。MappedByteBuffer
:它是java.nio
包中的一部分,用于内存映射文件。它将文件的一部分或全部内容映射到内存中,这样就可以像访问内存一样访问文件,而不需要使用传统的读写方法。这种方式通常通过操作系统底层的文件映射机制实现,可以提供比普通文件访问更高的性能。
- 内存映射:
RandomAccessFile
不提供内存映射功能。它读写文件时,数据需要在 Java 堆和文件系统之间来回传输。MappedByteBuffer
提供了内存映射文件的能力,这意味着文件的内容被映射到虚拟内存中,可以绕过标准 Java I/O,直接在内存地址空间中进行访问。
- 性能:
RandomAccessFile
的性能受限于 Java 的 I/O 系统,特别是当进行大量小规模读写操作时。MappedByteBuffer
通常可以提供更高的性能,尤其是在处理大文件时,因为它减少了数据在用户空间和内核空间之间复制的次数。
- 使用场景:
RandomAccessFile
更适合于随机读写操作,但不需要特别高的性能要求。MappedByteBuffer
适合于需要高性能的大文件处理,如数据库操作、日志处理等。
- 系统资源:
RandomAccessFile
使用的是 Java 的文件 I/O 资源。MappedByteBuffer
使用的是操作系统的虚拟内存资源,如果不当使用,可能会导致系统资源耗尽。
- 生命周期管理:
RandomAccessFile
的生命周期由 Java 的垃圾回收机制管理。MappedByteBuffer
的映射可能会持续存在,即使对应的 Java 对象被垃圾回收,直到显式调用Cleaner
或者sun.misc.Unsafe
的方法来释放映射。