文件io缓冲随机访问文件java
RandomAccessFile对文件的随机访问速度非常慢。您经常阅读有关在其上实现缓冲层的内容,但在线找不到这样做的代码
所以我的问题是:你们知道这个类的任何开源实现,会共享一个指针还是共享你们自己的实现
如果这个问题能够成为关于这个问题的有用链接和代码的集合,那就太好了。我相信,很多人都分享了这个问题,SUN也从来没有正确地解决过这个问题
请不要参考MemoryMapping,因为文件可能比整数大很多。最大值
你可以在下面搜索框中键入要查询的问题!
RandomAccessFile对文件的随机访问速度非常慢。您经常阅读有关在其上实现缓冲层的内容,但在线找不到这样做的代码
所以我的问题是:你们知道这个类的任何开源实现,会共享一个指针还是共享你们自己的实现
如果这个问题能够成为关于这个问题的有用链接和代码的集合,那就太好了。我相信,很多人都分享了这个问题,SUN也从来没有正确地解决过这个问题
请不要参考MemoryMapping,因为文件可能比整数大很多。最大值
# 1 楼答案
您可以使用以下代码从RandomAccessFile生成BufferedInputStream:
一些需要注意的事情
也许你想用这种方式
# 2 楼答案
如果您在64位机器上运行,那么内存映射文件是最佳方法。只需将整个文件映射到一个大小相等的缓冲区数组中,然后根据需要为每个记录选择一个缓冲区(即,edalorzo的答案,但是您需要重叠的缓冲区,这样就不会有跨越边界的记录)
如果您在32位JVM上运行,那么您就只能使用
RandomAccessFile
。但是,您可以使用它读取包含整个记录的byte[]
,然后使用ByteBuffer
从该数组中检索单个值。在最坏的情况下,您应该需要进行两次文件访问:一次用于检索记录的位置/大小,另一次用于检索记录本身但是,请注意,如果创建了大量
byte[]
,则可能会开始对垃圾收集器施加压力,如果在整个文件中跳出,则仍将保持IO绑定# 3 楼答案
# 4 楼答案
ApachePDFBox项目有一个很好且经过测试的
BufferedRandomAccessFile
类根据Apache许可证2.0版获得许可
它是java.io.RandomAccessFile类的优化版本,如Nick Zhang在JavaWorld.com上所述。基于jmzreader实现并扩展为处理无符号字节
请参见此处的源代码:
# 5 楼答案
嗯,可以在网上找到
首先,jpeg2000中的JAI源代码有一个实现,以及一个更无障碍的impl,位于: http://www.unidata.ucar.edu/software/netcdf-java/
javadocs:
http://www.unidata.ucar.edu/software/thredds/v4.3/netcdf-java/v4.0/javadoc/ucar/unidata/io/RandomAccessFile.html
# 6 楼答案
我看不出有什么理由不使用java。尼奥。MappedByteBuffer,即使文件大于整数。最大值
显然,不允许为整个文件定义一个MappedByteBuffer。但您可以让多个MappedByteBuffer访问文件的不同区域
FileChannel中位置和大小的定义。map的类型为long,这意味着可以提供大于整数的值。MAX_VALUE,唯一需要注意的是缓冲区的大小将不会大于整数。最大值
因此,您可以定义以下几种地图:
总之,大小不能大于整数。最大值,但起始位置可以在文件中的任何位置
在书Java NIO中,作者罗恩·希钦斯说:
我真的怀疑你会发现第三方API做得比这更好。也许你可以在这个架构上找到一个API来简化工作
你不认为这种方法应该对你有用吗