繁体   English   中英

Java nio:如何使用正确的字符集从内存映射文件中读取字符

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM