- - PR -
java.io.BufferedWriter クラスの close メソッドのデザインについての疑問
«前のページへ
1|2|3
投票結果総投票数:19 | |||
---|---|---|---|
親も close すべき | 13票 | 68.42% | |
親は放っておくべき | 6票 | 31.58% | |
|
投稿者 | 投稿内容 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-01-15 07:05
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6378948
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6266377 1.6の最新版では 直されているっぽいです | ||||||||||||||||||||
|
投稿日時: 2007-01-15 22:09
ありがとうございます。バグなのでしたか。てっきり仕様だと思っていました。そのため、バージョン間の比較もしていませんでした。 しかし、BufferedWriter は JDK 1.1 から備わったクラスですが、JDK 1.1 が登場したのは、調べると 1997年2月、とあります。10年近くずっと直されなかったということなのでしょうか。怖すぎます。こんな基本的なクラスがバグを抱えていたとすれば、バグ予測法を考えると Java はまだまだたくさんバグを抱えているということが推測できます。 また、これをバグなのか仕様なのかを判断する基準がなんなのかが分かりません。そもそも(Sun がおこなっているであろうと思われる)ユニットテストでひっかからないというのもおかしな話です。 -- unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86} | ||||||||||||||||||||
|
投稿日時: 2007-01-16 00:24
bw.close()でなぜbw=nullと補完したいのでしょうか?
ここのout.close(); でIOExceptionがでれば そのまま何度os.close()を行っても成立するはずがありません。 前にも書いたとおり、どのクラスがラップされているか BufferedWriterを使用する側では完全に解るとはいいきれません。 | ||||||||||||||||||||
|
投稿日時: 2007-01-16 00:31
確かに BufferedWriter はおおもとの Writer を close() するように変更されたらしいのですが、OutputStreamWriter は依然として おおもとの OutputStream を close() しないようです。なので unibonさんが仰っていたディスクフルの場合などを考えると、やはり、自力で FileOutputStream を close() した方が良いようです。以下、検証用のサンプルです。
| ||||||||||||||||||||
|
投稿日時: 2007-01-16 00:48
私はTdnr_Symさんの言っているとおり ファイルやDB接続などのリソースのクローズに失敗してしまったら、 あとは素直に「後始末をあきらめる」だけ だと思っています。 ディスクフルの場合 などは予めflushしてやることでExceptionが発生することが解るのですから (今回の変更はラップしているクラスを使いまわしている時のしのぎに過ぎないと思っています) 大抵の場合Writerを構築している中でcloseまで処理していることが多いのですが そうでない場合、どうその構成を知ろうとしているのか疑問でなりません。 | ||||||||||||||||||||
|
投稿日時: 2007-01-16 01:12
(1から数えて)14番目の投稿( http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=36027&forum=12&start=13 )でも書きましたが、今回の場合は、クローズに失敗するのは BufferedWriter のクローズであって、おおもとの(underlying な) FileOutputStream はクローズされないままになっているのです。オープンしたものがクローズされないままになっているわけですし、そもそもそのオブジェクトに対してクローズが試行すらされていないわけですから、諦めがつきません。 私も、FileOutputStream のクローズを試してそれに失敗したのなら、あとは素直に諦めるだけです。 -- unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86} | ||||||||||||||||||||
|
投稿日時: 2007-01-16 22:10
なぜ
BufferedWriterのflushが呼べないのでしょう? また IOExceptionをcatchした後なぜ bw.close() が呼べないのでしょう? CharsetEncoderを継承したクラスがしっかりとresetしていれば ディスクフルの場合でもbw.close()は FileOutputStreamのcloseを呼び出していると読めるのですが 私が見ているソースが違うのだろうか・・ | ||||||||||||||||||||
|
投稿日時: 2007-01-16 23:19
ちょっと古い部分にレスをつけます。
>> unibonさん
C言語の標準関数 fclose() も内部で fflush() 呼びますし、私はこれは一般的な動作だと思っています。
・flush() した後は write() できる。 ・close() した後は write() できない。 この考え方でいけば、例えば base64 エンコードをする OutputStream を考えた時、最後にエンコードしたデータが 3バイトに満たなかった場合、その分だけ = 記号を最後に付加するような処理は close() で実装すると思いますし、flush() では 3バイト未満のデータはバッファに残ったままになると思います。 >>kumaさん
※ちゃんと OutputStreamWriter の実装を見てないので間違っているかもしれませんが、例えば ISO-2022-JP にエンコードしていた場合は close() だけで GL に ASCII を呼び出すエスケープシーケンスが出力される可能性もあるため、close() の直前に flush() を呼んだとしても、close() 内でデータが出力されるかもしれません…… |
«前のページへ
1|2|3