3
我有一个1.99 GB的字符文件。现在,我想从该文件中随机抽取数百万个子序列,例如从位置90到190,10到110,50000到50100等(每个长度为100个字符)。Java - Char缓冲区问题
我通常做它用,
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);
这不会出现以上错误但返回输出:
ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹ä¹
这应该是“0111.11亿........”
任何人可以帮助我,为什么这样的事情发生,如何解决呢?
基于文档“IllegalArgumentException - 如果容量是负整数”。可以尝试通过使用allocate()明确设置容量?http://docs.oracle.com/javase/1.5.0/docs/api/java/nio/CharBuffer.html – kosa 2012-08-14 18:34:40
@thinksteep,我明确地将它设置为20亿,给出IllegalArgumentException异常。 – Arpssss 2012-08-14 18:44:23
为JVM -Xmx设置分配的内存是多少? – kosa 2012-08-14 18:46:16