3

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......」

なぜこのようなことが起こっているのか、それを解決する方法を教えてくれる人はいますか?

4

1 に答える 1

2

私はただ推測していますが、舞台裏で巨大なCharset.decode(ByteBuffer)ものを割り当てようとすると失敗すると思います。繰り返しますが、これは単なる推測ですが、メソッドはバッファーの現在の位置からその制限までのバイトのみをデコードするため、次のようなことができます。 CharBufferdecode

ByteBuffer buffer = ...
Charset charset = ...

buffer.position(0);
buffer.limit(100);

System.out.println(charset.decode(buffer));

CharBufferメソッドによって返されるの容量 (文字数) はdecode100 になります。

(ちなみに、特定の文字セットを使用してデコードしなかったため、2回目の試行で誤った出力が得られると思いますCharBuffer.

于 2012-08-14T18:58:46.683 に答える