4

指定された文字セットを使用して、OFFSETのテキストファイルからchar [](サイズはCOUNT)を読み取る必要があります。COUNTとOFFSETは、バイト単位ではなく文字単位です。彼は私のコードです:

raf = new RandomAccessFile(filePath, "r");      
if ((mBuffer == null) || (mBuffer.length < count)) {
    mBuffer = new byte[(int)(count/mDecoder.averageCharsPerByte())];
    mByteWrap = ByteBuffer.wrap(mBuffer);
    mCharBuffer = new char[count];
    mCharWrap = CharBuffer.wrap(mCharBuffer);
}
try {
    offset = (int)(offset/mDecoder.averageCharsPerByte());
    count = (int)(count/mDecoder.averageCharsPerByte());
    raf.seek(offset);
    raf.read(mBuffer,0,count);
    mByteWrap.position(0);
    mCharWrap.position(0);
    mDecoder.decode(mByteWrap, mCharWrap, true);
} catch (IOException e) {
    return null;
}
return mCharBuffer;

もっと簡単な方法はありますか?(手動で一致するchar-> byteなし)

java.util.Scannerを探していましたが、イテレータスタイルであり、ランダムアクセススタイルが必要です。

PSデータは何度もコピーしないでください

4

2 に答える 2

4

BufferedReaderのskip()メソッドを使用します。あなたの場合:

BufferedReader reader = new BufferedReader(new FileReader(filePath));
reader.skip(n); // chars to skip
// .. and here you can start reading

また、特定のエンコーディングを指定したい場合は、

InputStream is = new FileInputStream(filePath);
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF-8"));
reader.skip(n); // chars to skip
// .. and here you can start reading
于 2012-04-11T08:56:30.890 に答える
0

BufferedInputStreamのread(byte [] b、int off、int len)を使用できます

ここでオフはオフセットされています(読み始めたい場所からのポイント)

http://docs.oracle.com/javase/7/docs/api/java/io/BufferedInputStream.html#read%28byte []、%20int、%20int%29

于 2012-04-11T09:40:31.350 に答える