0

大きなファイルの一部をループで読み取りたい。ファイル全体を読み取る必要がありましたが、うまくいきませんでした。ファイルが大きすぎるという例外が発生していました。コードを以下のリストに変更しました。以下のコードは、最初のチャンクのみを読み取ります。次のチャンクに移動するには、何を変更する必要がありますか。

   final FileInputStream fis = new FileInputStream(f);
    final FileChannel fc = fis.getChannel();
    final long sizeRead = fc.size() < defaultReadBufferSize ? fc.size() : defaultReadBufferSize;
    final MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, sizeRead);        
    while (bb.hasRemaining()) {                        
        final CharBuffer cb = decoder.decode(bb);
        this.search(f, cb);   
        System.out.println("============>" + cb.length());
        System.out.println("============>" + bb.hasRemaining());            
    }        
    fc.close();
4

1 に答える 1

3

問題は、この方法では文字エンコードされたデータにアクセスできないことです。つまり、文字間の境界がどこにあるかを知る必要があります。

ファイルにアクセスして文字をデコードするコストは、ファイルを読み取る方法よりもはるかに高価になる可能性が高いため、同様にはるかに単純な BufferedReader を使用します。

たとえば、1000 番目のバイトから読み取りたいとします。それはできますが、1000 番目のバイトがマルチバイト文字の一部であるかどうかはわかりません。

すべての文字がバイトであると仮定できる場合、問題全体がはるかに単純になり、CharBuffer は必要ありません。ByteBuffer に直接アクセスすると、はるかに高速になります。

于 2011-07-11T14:15:28.463 に答える