開発日記7:Java

適当に自分が不安なところでJavaのお題10個作ってみた。

1.キーボードで入力した文字がテキストファイルで保存される
2.指定のファイルを読み込み、コンソールに内容を出力する
3.ファイルの中身を全て大文字に書き換える
4.処理時間をはかる(スリープ使用)
5.現在日付を「/」区切りで表示する
6.指定のパス配下にファイルが存在するか確認し、存在する場合はファイルサイズ、ファイル名を表示し、
存在しない場合は存在しない旨をコンソールに出力する。
7.指定のパス配下に指定のファイル名が存在しない場合、ファイル名を全て「sample.txt」にする。
8.もし指定のパス配下に「delete.txt」が存在したら削除する。
9.入力した年がうるう年かどうか調べる。
10.区切り文字を入れて文字を繋ぐ(join)

とりあえず1をやってみたので課題などメモ。

1について

こんな感じで書いてみた。finallyもtry-with-resourcesも使っていないのでよろしくないコードかも。

22行目でBufferedReaderのclose処理、
46行目でFileWriterのclose処理をコメントアウトしているけど、
下記表の通り、FileWriterのcloseを行った場合のみ書込みが出来た。

コメントアウト対象 結果
なし 書込可
22行目のみ 書込可
46行目のみ 書込不可
22行目と46行目 書込不可

flushという考え方がキーになっているっぽい。
書込にはバイト出力ストリーム(java.io.OutputStream)と、
(文字出力ストリーム(java.io.Writer)があって、
バイト出力:close前にflushメソッド呼ぶ必要あり(じゃないとデータの終わり部分がストリームに書き込まれない場合あり)
文字出力:closeメソッドの処理の中でフラッシュを行うようになっているのでflushメソッドを呼ぶ必要なし
で、今回のFileWriterは後者なので、flushメソッドは使わなくても書込みができたという話

今後:
・バイト出力ストリームを使う場合は、flushメソッドは忘れない
・close処理を行うときはJava7以降登場したtry-with-resourcesの利用
⇒try-finallyと比較した場合、下記の利点があるとのこと
1.自動でcloseしてくれる(try-finallyだとfinallyブロックでcloseしないといけなかったりした)
2.tryブロックとfinallyブロックで例外が発生した場合、finallyブロックの中で発生した例外がスローされて、もともと例外が発生した元のtryブロックの例外が分からなくなる問題があったが、
try-with-resourcesだと、tryブロックの例外がスローされるとのこと。

明日からは2からやろ。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA