[英]Java nio: How to read characters from memory mapped file with correct charset
对于一个新项目,我必须读取文件的字符(具有可配置的编码)来处理输入。 由于其中一些文件可能非常大(> 100MB),我想查看Java nio的内存映射文件的能力,以便更快地访问。
但是,我无法弄清楚,我是如何创建“Reader”的 - 就像使用正确的字符集解码从MappedByteBuffer中读取一样。
要创建MappedByteBuffer,我目前使用:
RandomAccessFile raFile = new RandomAccessFile("myFile.bla", "r");
FileChannel channel = raFile.getChannel();
MappedByteBuffer mappedByteBuffer = channel.map(MapMode.READ_ONLY, 0, channel.size());
我知道,我可以使用getChar()从MappedByteBuffer中获取一个字符,但是如何指定编码呢? 在它所说的javadoc中,总是读取两个字节并将其组合成一个char,但是ASCII编码文件是什么?
我还找到了Channels.newReader(...)方法,但是它们只能处理通道,而不能处理内存映射文件。 MappedByteBuffer有类似的东西吗?
只是为了确保:我知道内存映射是一个有点昂贵的操作,因此只对较大的文件有用。 我还没有决定是否使用它,但是想要根据我的特殊用例进行评估。
非常感谢提前+最好的问候,安德烈亚斯
您可以使用Charset#newDecoder()
从您最喜欢的Charset
检索到的CharsetDecoder
。
StandardCharsets.UTF_8.newDecoder().decode(mappedByteBuffer)
这将返回一个CharBuffer
,您可以从中获取char
值 。
请注意,这确实消耗了完整的MappedByteBuffer
。 如果您只需要几个字节,请从原始MappedByteBuffer
的几个字节构造一个新的ByteBuffer
并对其进行解码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.