0

ファイルを1行ずつ処理する必要があり、行の先頭のオフセットを知りたいです。BufferedInputStreamにはreadLineがないため、独自のreadLineをコーディングしました。オフセット以外は正常に動作します。ファイルの長さが長くなると、offsetは誤った値を返します。私のコードの何が問題になっていますか?

class MyBufferedInputStream extends BufferedInputStream {
    long offset = 0;

    public MyBufferedInputStream(InputStream in) {
        super(in);
    }

    public String readLine() throws IOException {
        int b, i = 0;
        byte[] buf = new byte[256];

        while (true) {
            b = read();
            offset++;
            if (b == -1)
                return null;
            else if (b == '\n') 
                return (new String(buf));
            else // assume line in not longer than 256
                buf[i++] = (byte) b;
        }
    }

    public long getOffset() {
        return offset;
    }

    public void resetOffset() {
        offset = 0;
    }
}
4

3 に答える 3

0

Pescisがコメントで示唆しているように、独自のメソッドを拡張して追加するのBufferedReaderではなく、テキストの行を読むために使用する必要があります。BufferedInputStreamreadLine()

Javaには、I / O用の2種類のクラスがあります。ストリームと、リーダー/ライターです。

ストリームjava.io.InputStreamjava.io.OutputStreamおよびそれらを拡張するすべてのもの)は、バイナリデータ(バイト)を読み取るためのものです。

リーダーライターjava.io.Readerおよびjava.io.Writer)は、テキストの読み取りと書き込み用です。これらには、文字エンコードを使用して、文字をバイト間で変換するロジックが含まれています。

new String(buf)コードでは、バイトを含むバッファを文字列に変換するために使用していることに注意してください。文字エンコードを指定していないため、システムのデフォルトの文字エンコードが使用されますが、これは必ずしも希望どおりではありません。

の使用例BufferedReader

InputStream in = ...;  // Wherever you get an InputStream from

BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));

String line;
while ((line = br.readLine()) != null) {
    System.out.println(line);
}

br.close();
于 2013-02-26T12:39:18.090 に答える
0

データを読み取るときにフラッシュする必要があり、最後にバッファを閉じると、一部のデータがメモリ内に残っている可能性があり、競合が発生する可能性があります。そのため、データが適切に実行されず、結果が表示される場合と表示されない場合があります。

于 2013-02-26T12:30:45.887 に答える
0
  1. 行が 256 バイトのバッファよりも長い場合、オーバーフローが発生します
  2. 改行で終わらない場合、最後の行は返されません (null を返します)。
  3. \n10 バイトを通過した後に a が見つかった場合は、長さ 256 の新しい String が返されます。最初の 10 文字は行で、246 文字\0です。つまり、行の長さに関係なく、常に各行に 256 文字の文字列を返します。

を使用せず、バッファリングされたリーダーnew BufferedReader(new InputStreamReader(stream))を呼び出す理由は何ですか?readLine

于 2013-02-26T14:28:10.187 に答える