本節では、テキストファイルの出力を扱います。バイナリファイルの出力は扱いません。
ファイル出力のためには、FileOutputStreamクラスを利用します。ところが、このクラスが提供する機能はとても貧弱のため、このクラスだけでテキストの出力を行うのは大変です。便利なPrintWriterクラスを利用するために、OutputStreamWriterクラスを間に挟ませ、また、ファイルアクセスの効率化のために BufferedWriterクラスを利用します。
詳しい解説はしません。ほとんど定型的に利用すれば大丈夫です。ただし、非ランタイム系例外である FileNotFoundExceptionが発生する可能性があるため、これを catchするか throwsするかを明示する必要があります。
また、ファイル出力が終わったら、closeメソッドを使用してファイルを閉じます。
これらのクラスについて詳細が気になる方は、説明書(API)を参照してください。Java SE 7(Java 1.7)の説明書(API)を掲示しておきます→FileOutputStreamクラス、OutputStreamWriterクラス、BufferedWriterクラス、PrintWriterクラス。
テキストファイルに文字列を出力するプログラムを製作してみます。
ソースコードは以下の通り。
U101/U101.java
import java.io.BufferedWriter; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; /** * ファイル出力します。 */ public class U101 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { try { // 一連のインスタンスを生成 FileOutputStream fos = new FileOutputStream("sample.txt"); OutputStreamWriter osw = new OutputStreamWriter(fos); BufferedWriter bw = new BufferedWriter(osw); PrintWriter pw = new PrintWriter(bw); // 文字列を出力する pw.println("abcdefg"); pw.println("こんにちは。"); pw.println("こんばんは。"); // クローズする pw.close(); System.out.println("正常に出力しました。"); } catch (FileNotFoundException e) { System.out.println("異常が発生しました。"); } } }
実行結果は以下の通り。
正常に出力しました。
sample.txtは生成されましたが、eclipse上では直ちには確認できません。パッケージエクスプローラーの内容を更新(リフレッシュ)する必要があります。U101プロジェクトを選択して右クリックし「Refresh」を選択します。
すると、U101プロジェクトの内容が更新され、sample.txtが一覧に表示されるようになります。
sample.txtをダブルクリックすると、ファイルを開くことができます。
sample.txtの中身は以下の通り。
abcdefg こんにちは。 こんばんは。
上手く出力されていることが分かります。
Java仮想マシン内では、文字コードはUnicodeと決められています。ただ、キーボードからの入力や画面への文字表示は、適宜、Java仮想マシンが動作するパソコンの文字コードへの変換が行われていました。もし、仮にこのような変換が行われないならば、入力も出力も文字化けしてしまいます。
ファイル入出力においても、Java仮想マシンが動作するパソコンの文字コードへの変換が自動的に行われます。例えば、Windowsパソコンの場合には、シフトJISコードで日本語が出力されます。
もし、特定の文字コードを指定してテキストファイルを出力したい場合には、OutputStreamWriterクラスのコンストラクタで、文字コードを指定することで対応できます。