こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ファイル出力クラスの選択について(Java)

少し長文になります。

Javaで、複数のオブジェクトに格納された文字列をループでgetして、
1つのファイル(test.txt)内に出力していくプログラムを作っています。

ファイル出力する際に使用可能なクラスがいくつもあるため、
どれを選択すればいいのか迷ってます。

以下の条件から、使用すべきクラスを教えて下さい!

<ファイル出力の条件>
ーーーーーーーーーーーーーー
1. ファイル(test.txt)は毎回新規で1ファイルのみ作成して、
  そのファイル内にオブジェクトからループでgetした文字列を1行ずつ出力していく。
  (次回実行の直前に、前回のtest.txtは手動削除する。)

2. test.txt内には日本語が出力される可能性があり、且つ、
  test.txtをWindowsのアプリケーションで利用するため、
  SJISにエンコードして出力する。
  ※Javaの実行環境はLinux

3. バッファを使って出力する。
ーーーーーーーーーーーーーー

以上です。

私の考えでは、全てキャラクタストリームを使って、
----------
FIleWriter fw = new FileWriter("test.txt",true); 
OutputStreamWriter osw = new OutputStreamWriter(fw,"SJIS");
BufferedWriter bw = new BufferedWriter(osw);
----------
でいいのかなと思ったのですが、
ネットを見ていると
----------
FileOutputStream os = new FileOutputStream("output");
OutputStreamWriter osw = new OutputStreamWriter(os, "JIS");
BufferedWriter bw = new BufferedWriter(osw);
PrintWriter pw = new PrintWriter(bw);
----------
という記述もあり、
わざわざキャラクタストリームとバイトストリーム(FileOutputStream)を混ぜて使っている意図もよく分かりません。
(文字列を扱うのに、バイトストリームを使う意味って無いですよね??)

それから、私の例では
FIleWriterインスタンス生成時の引数で"true"を指定して
test.txtに"追記"するように設定してますが、
test.txt自体は毎回新規作成のものを使うので、この場合trueもfalseも不要でしょうか??
(→認識の確認として、
「trueやfalseはあくまで既存ファイルに対しての追記/上書きの設定であって、
ファイルをオープンしてクローズするまでの間はtrueなど設定しなくても
ずっと末尾に追記されていく」という認識でOK?)

また、true/falseが不要な場合、
FIleWriterは使わずに、
----------
OutputStreamWriter osw = new OutputStreamWriter("test.txt","SJIS");
BufferedWriter bw = new BufferedWriter(osw);
----------
としても問題無いでしょうか??


以上、分かる方、アドバイスください!

投稿日時 - 2011-10-21 01:38:26

QNo.7084604

すぐに回答ほしいです

質問者が選んだベストアンサー

APIはごらんになっていますか?
http://java.sun.com/javase/ja/6/docs/ja/api/java/io/OutputStreamWriter.html

>OutputStreamWriter osw = new OutputStreamWriter(fw,"SJIS");
>OutputStreamWriter osw = new OutputStreamWriter("test.txt","SJIS");
まず、このようなコンストラクタはOutputStreamWriterクラスにはありません。
引数に渡せるのはjava.io.OutputStreamクラスとそのサブクラスだけです。

なので、文字コードを指定したいなら必然的に
>FileOutputStream os = new FileOutputStream("output");
>OutputStreamWriter osw = new OutputStreamWriter(os, "JIS");
>BufferedWriter bw = new BufferedWriter(osw);
といったコードになると思います。

そこまでパフォーマンスを気にしなくてもいいのであれば、
PrintWriter pw = new PrintWriter("test.txt", "SJIS");
でいいのかもしれませんけど。

投稿日時 - 2011-10-21 11:19:35

お礼

的確なご回答ありがとうございます。
今回はパフォーマンスもある程度考慮しなくてはならないのでバッファも使うことにしました。

ありがとうございました!

投稿日時 - 2011-10-24 21:22:38

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問