我有一个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 ........"
任何人都可以帮助我为什么会发生这种事情以及如何解决这个问题?
答案 0 :(得分:2)
我只是在猜测,但我认为Charset.decode(ByteBuffer)
在尝试在幕后为您分配巨大的 CharBuffer
时会失败。同样,这只是一种预感,但decode
方法只将字节从缓冲区的当前位置解码到其限制,因此您可以执行类似的操作。
ByteBuffer buffer = ...
Charset charset = ...
buffer.position(0);
buffer.limit(100);
System.out.println(charset.decode(buffer));
CharBuffer
方法返回的decode
的容量(以字符为单位)将为100。
(旁注,我认为你的第二次尝试会产生错误的输出,因为你没有使用特定的字符集来解码你的CharBuffer
。)