Java – Char缓冲区问题

我有一个1.99 GB的字符文件。 现在,我想从该文件中随机提取数百万个子序列,例如从位置90到190,10到110,50000到50100等(每个长度为100个字符)。

我经常这样做,

FileChannel channel = new RandomAccessFile(file , "r").getChannel(); ByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size()); Charset chars = Charset.forName("ISO-8859-1"); CharBuffer cbuf = chars.decode(buffer); String sub = cbuf.subSequence(0, 100).toString(); System.out.println(sub); 

但是,对于上面代码为1.99 gb的文件会出错,

 java.lang.IllegalArgumentException at java.nio.CharBuffer.allocate(CharBuffer.java:328) at java.nio.charset.CharsetDecoder.decode(CharsetDecoder.java:792) at java.nio.charset.Charset.decode(Charset.java:791) 

所以,我使用了以下代码,

 FileChannel channel = new RandomAccessFile(file , "r").getChannel(); CharBuffer cbuf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size()).asCharBuffer() ; String sub = cbuf.subSequence(0, 100).toString(); System.out.println(sub); 

它没有给出上面的错误但返回输出:

 ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ 

哪个应该是“011111000000 ……..”

任何人都可以帮助我为什么会发生这种事情以及如何解决它?

我只是猜测,但我认为Charset.decode(ByteBuffer)在尝试在幕后为你分配一个巨大的 CharBuffer时会失败。 同样,这只是一种预感,但decode方法只将缓冲区当前位置的字节解码到其限制,因此您可以执行类似的操作。

 ByteBuffer buffer = ... Charset charset = ... buffer.position(0); buffer.limit(100); System.out.println(charset.decode(buffer)); 

decode方法返回的CharBuffer的容量(以字符为单位)将为100。

(另一方面,我认为你的第二次尝试会产生错误的输出,因为你没有使用特定的字符集来解码你的CharBuffer 。)