
ファイル出力に関して、次のようなコードをよく目にします。
例外処理省略
FileOutputStream fos = new FileOutputStream("hoge.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos);
BufferedWriter bw = new BufferedWriter(osw);
//ファイルに出力
bw.close();
osw.close();
fos.close();
同様の処理で、次のようなコードも目にします。
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("hoge.txt")));
//ファイルに出力
bw.close();
下のコードで、関連するソースを見てみると、BufferedWriterオブジェクトをcloseする際に、そのオブジェクトが参照を持っているOutputStreamWriterオブジェクトはcloseされているように見えるのですが、FileOutputStreamオブジェクトがcloseされているようには見えませんでした。
下のようなコードは安全といえるのでしょうか?BufferedWriterオブジェクトのcloseで引数として渡される各オブジェクトもcloseされるのでしょうか?
No.1ベストアンサー
- 回答日時:
BufferedWriter#closeはコンストラクタで受け取ったWriter#closeメソッドを呼び出しますが、
OutputStreamWriter#closeはコンストラクタで受け取ったFileOutputStreamではなく
FileOutputStreamから作り出した別のオブジェクトのcloseを呼び出します。
なので下ではFileOutputStreamのcloseが呼ばれず、
先程作り出した別のオブジェクトのcloseを呼んでいます。
…直接呼ばれていないだけかもしれないですけど…
上のコードでも
bw.close(); // 1
osw.close();// 2
fos.close();// 3
1の中で2が呼ばれているので、
正常に実行されるとOutputStreamWriter#closeが2回呼ばれている事になります。
…もしかするとFileOutputStreamだけでもclose呼んだ方が良いかも知れません
二重に開放する事で別の問題が生じるかもしれませんが…
>正常に実行されるとOutputStreamWriter#closeが2回呼ばれている事になります。
そうなんですよね。でも一応正常に動いているので、ダイジョブなのかなぁと考えてしまっているんですが。
>FileOutputStreamだけでもclose呼んだ方が良いかも知れません
そうしてしまえばまあ確実ですよね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/08/10 14:24
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) VBA★PDFをPDFアプリで印刷しようと思っていますが上手くゆきません 1 2022/06/06 22:04
- Visual Basic(VBA) 3個のfileのセルデータを1個のfileのセルに貼り付けるVBAコードですが。 1 2023/02/20 09:21
- Visual Basic(VBA) Excel VBAについて、 フォルダ内のファイルを全て開きたい場合、 FSOを使えば、Dirは使わ 1 2023/01/27 13:18
- 英語 2 SPEAKING NATURALLY People often use informal ter 1 2023/05/08 18:09
- FX・外国為替取引 pine scriptのコードが動作しない 1 2023/02/01 19:03
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- Excel(エクセル) Excelのマクロコードについて教えてください。 1 2022/03/27 10:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCEL VBAにて動的にCheckBOXを...
-
VBAのWindowオブジェクトとWork...
-
Strutsのbeanタグについて
-
パワーポイントのVBAでテキスト...
-
VBA 同じ名前のオブジェクトを...
-
Excelで =EMBED("Acrobat Docu...
-
多人数のじゃんけんプログラム
-
C#でフォームのオブジェクト名...
-
非アクティブの状態で表示され...
-
VBA 過去のファイル内の同じオ...
-
オブジェクトを枠線に合わせる...
-
オブジェクトレベルとメタレベル
-
3Dの背景とはどういう作り方を...
-
C++でのクラスオブジェクトの破棄
-
CoCreateInstanceでエラーになる。
-
COMコンポーネントって何?
-
三角形オブジェクト
-
error C2712: オブジェクト ア...
-
Power Pointのページ設定について
-
ビジュアルC++でボタンの有...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelで =EMBED("Acrobat Docu...
-
パワーポイントのVBAでテキスト...
-
EXCEL VBAにて動的にCheckBOXを...
-
VBA 同じ名前のオブジェクトを...
-
C#でフォームのオブジェクト名...
-
VBAのWindowオブジェクトとWork...
-
ビジュアルC++でボタンの有...
-
COMコンポーネントって何?
-
CoCreateInstanceでエラーになる。
-
ワイルドカード<?>と型パラメー...
-
戻り値がクラスオブジェクト
-
error C2712: オブジェクト ア...
-
Vbで通常使用するプリンターを...
-
質問すいません。 javascriptの...
-
Object型からDouble型へのキャスト
-
Accessの連結・非連結オブジェ...
-
オブジェクトレベルとメタレベル
-
C++でのクラスオブジェクトの破棄
-
時間帯判定をする。
-
VBAでvlookup関数から、別シー...
おすすめ情報