5

BufferedReader を使用して、バイト ストリーム (UTF-8 テキスト) を 1 行ずつ読み取ります。特定の理由から、バイト ストリーム内の正確な行の開始位置を知る必要があります。

問題: BufferedReader にプラグインする InputStream の位置を使用できません。同様に、リーダーはバッファリングし、一度に複数の行を読み取ります。

私の質問:読み取った各行の正確なバイト オフセットを特定するにはどうすればよいですか?

(行 + "\n").getBytes("UTF-8").length. このアプローチには 2 つの問題があります。1) バイト数をカウントするだけで、文字列をバイトに変換するのはかなりのオーバーヘッドです。2) 改行は常に "\n" でマークされているとは限らず、"\ である可能性もあります。 r\n」など

これに対する他の解決策はありますか?

編集:これまでに見たすべての LineReader のようなクラスは、バッファリングされているようです。バッファリングされていない LineReader のようなクラスを知っている人はいますか?

4

2 に答える 2

1

ファイルを生のバイトとして読み取るだけで、UTF-8 の改行は常に13and 1013または10... になりますが、ファイルの EOL 規則が異なる場合にファイルを文字列として読み取る場合に発生する問題とまったく同じです。

に相当する生のバイトBufferedReaderBufferedInputStream

エンコードせずに文字列の UTF-8 バイトをカウントすることもできます。

public static int byteCountUTF8(String input) {
    int ret = 0;
    for (int i = 0; i < input.length(); ++i) {
        int cc = Character.codePointAt(input, i);
        if (cc <= 0x7F) {
            ret++;
        } else if (cc <= 0x7FF) {
            ret += 2;
        } else if (cc <= 0xFFFF) {
            ret += 3;
        } else if (cc <= 0x10FFFF) {
            ret += 4;
            i++;
        }
    }
    return ret;
}
于 2013-01-19T14:22:53.547 に答える
0

バッファサイズを設定してみてください:

BufferedReader (Reader in, int sz)

パラメーター:

in - リーダー

sz - 入力バッファサイズ

バッファリング サイズを 1 に設定します。

于 2013-01-19T14:22:27.900 に答える