今日の役に立たない一言 - Today’s Trifle! -

古い記事ではさまざまなテーマを書いていますが、2007年以降はプログラミング関連の話がほとんどです。

Java でストリーム

BufferedInputStream#mark() を使った後、reset() したときに例外が発生することがある。

java.io.IOException: Resetting to invalid mark
        at java.io.BufferedInputStream.reset(Unknown Source)
        :

mark() したあと、どう見ても 8192 バイトものデータをストリームから読み込んだりしてはいない。どゆこと?
で、java.io.BufferedInputStream のソース(JDK1.3.1)を読んでみたらバグってるところを発見。「ストリームの先頭で mark() した」あとに「ストリームからバッファサイズ以上のデータを読み込むためバッファサイズを拡大した」場合に reset() すると、例外が発生してしまうように書かれている。
うむむ、どうやって回避しよう。。。