ファイル入出力

テキストファイルの書き込み・読み出し

import java.io.*;

class File01
{
    public static void main(String[] args)
    {
        try {
            FileWriter fw = new FileWriter("test.txt");
            fw.write("ABCDEFG\n");
            fw.close();

            FileReader fr = new FileReader("test.txt");
            int c;
            while ((c = fr.read()) != -1)
                System.out.print((char)c);  // ABCDEFG
            fr.close();
        } catch (IOException e){
        }
    }
}
$ cat test.txt
ABCDEFG
FileWriterクラスとFileReaderクラスは、ファイルへの文字列の書き込みと読み出しの機能を提供します。
コンストラクタに入出力を行うファイルのパス、もしくはFileクラスのオブジェクトを指定することで当該ファイルを開きます。指定するファイルが存在しない場合は、FileWriterでは新規作成し、FileReaderでは例外(FileNotFoundException)となります。
生成されたインスタンスのwrite()・read()メソッドによりファイルへの文字列の書き込み・読み出しを行います。入出力処理が終了してファイルを閉じるときはclose()メソッドを呼び出します。
int read() 1文字を読み出す。ファイル末尾に到達した場合は-1を返す。
write(文字列) 文字列を書き込む。
import java.io.*;

class File02
{
    public static void main(String[] args)
    {
        try {
            FileWriter fw = new FileWriter("test.txt"true);
            fw.write("HIJKLMN\n");
            fw.close();
        } catch (IOException e){
        }
    }
}
$ cat test.txt
ABCDEFG
HIJKLMN
FileWriterクラスのコンストラクタの第二引数(ブール値)は追加書き込みのオプションとなっており、trueを指定するとファイル末尾への追加書き込みで開かれます。
write()メソッドで書き込んだ文字列は、既存の内容の末尾に追記されます。falseの場合、または指定しない場合は、ファイルの既存の内容を空にしてからの書き込みになります。

バイトデータのファイルストリーム入出力

import java.io.*;

class File03
{
    public static void main(String[] args)
    {
        try {
            FileOutputStream fo = new FileOutputStream("test.txt");
            byte[] b = {65666768697071};
            fo.write(b);
            fo.close();
            FileInputStream fi = new FileInputStream("test.txt");
            int c;
            while ((c = fi.read()) != -1
                System.out.print((char)c);
            fi.close();
        } catch (IOException e){
        }
    }
}
$ cat test.txt
ABCDEFG
FileOutputStreamクラス、およびFileInputStreamクラスは、バイトデータのファイルへの入出力機能を提供します。コンストラクタに入出力を行うファイルのパス、もしくはFileクラスのオブジェクトを指定することで当該ファイルを開きます。指定するファイルが存在しない場合は、FileOutputStreamでは新規作成し、FileInputStreamでは例外(FileNotFoundException)となります。
生成されたインスタンスのwrite()・read()メソッドによりファイルへのバイトデータの書き込み・読み出しを行います。入出力処理が終了してファイルを閉じるときはclose()メソッドを呼び出します。
int read() 1バイトを読み出す。ファイル末尾に到達した場合は-1を返す。
write(byte[]) バイトデータ配列を順番に書き出す。

ファイルストリームの文字列変換入出力

import java.io.*;

class File04
{
    public static void main(String[] args)
    {
        try {
            FileOutputStream fo = new FileOutputStream("test.txt");
            OutputStreamWriter sw = new OutputStreamWriter(fo, "UTF-8"); 
            sw.write("あいうえお"13);
            sw.close();
            FileInputStream fi = new FileInputStream("test.txt");
            InputStreamReader sr = new InputStreamReader(fi, "UTF-8");
            int c;
            while ((c = sr.read()) != -1
                System.out.print((char)c);      // いうえ
            sr.close();
        } catch (IOException e){
        }
    }
}
$ cat test.txt
いうえ
OutputStreamWriterクラス、およびInputStreamReaderクラスは、バイトデータのストリームを文字列に変換しながらファイルへの入出力を行います。
コンストラクタにはOutputStream・InputStreamクラスを継承したストリームクラスを指定します。ファイル入出力の場合は、FileOutputStream・FileInputStreamクラスにより開いたファイルを指定します。FileOutputStream・FileInputStreamクラスで開いたファイルをOutputStreamWriter・InputStreamReaderクラスを通じて文字列で扱う一連の手続きをまとめたものが、FileWriter・FileReaderクラスです。ただし、それらではCharsetは指定できません。
生成されたインスタンスのwrite()・read()メソッドによりファイルへの指定するCharsetでの文字列の書き込み・読み出しを行います。入出力処理が終了してファイルを閉じるときはclose()メソッドを呼び出します。

ファイルストリームのバッファ入出力

import java.io.*;

class File05
{
    public static void main(String[] args)
    {
        try {
            BufferedWriter bw = new BufferedWriter(new FileWriter("test.txt"));
            bw.write("ABCDEFGあいうえお\n");
            bw.flush();
            bw.close();
            BufferedReader br = new BufferedReader(new FileReader("test.txt"));
            String s = br.readLine();
            System.out.println(s);  // ABCDEFGあいうえお
            br.close();
        } catch (IOException e){
        }
    }
}
$ cat test.txt
ABCDEFGあいうえお
BufferedWriterクラス、およびBufferedReaderクラスは、ストリームを内部的にバッファリングを行うことで効率的に入出力を行います。
コンストラクタにはWrite・Readerクラスの継承クラスを指定します。一般にFileWriter・FileReaderクラスやOutputStreamWriter・InputStreamReaderクラスのオブジェクトを指定します。
生成されたインスタンスのwrite()・read()メソッドによりファイルストリームへの書き込み・読み出しを行います。write()メソッドでは、逐一ファイルへ出力せずに内部的にバッファリングを行います。flush()メソッドによりバッファの内容を強制的にファイルに書き出すことができます。readLine()メソッドはテキストファイルを行単位で読み出します。終端を読み出した場合はnullを返します。入出力処理が終了してファイルを閉じるときはclose()メソッドを呼び出します。BufferedWriterではバッファを書き出してから閉じます。

try-with-resourceによるcloseの省略

import java.io.*;

class File06
{
    public static void main(String[] args)
    {
        try (FileWriter fw = new FileWriter("test.txt")) {
            fw.write("ABCDEFG\n");
        } catch (IOException e){
        }
    }
}
close()メソッドをtryブロックの中に実装すると、処理中に例外が発生した場合はclose()メソッドが呼び出されません。例外を考慮すればclose()メソッドはfinallyブロックで呼び出す必要がありますが、そのときもtry〜catchにより例外捕捉する必要があるので、かなり面倒なものになります。
close()メソッドを持つ以下のクラス
FileWriter・FileReader
FileOutputStream・FileInputStream
OutputStreamWriter・InputStreamReader
BufferedWriter・BufferedReader
は、AutoCloseableインタフェースを実装しているので、try-with-resource構文を使うことでclose()メソッド呼び出しを省略できます。
import java.io.*;

class File07
{
    public static void main(String[] args)
    {
        try (FileWriter fw = new FileWriter("test.txt");
            BufferedWriter bw = new BufferedWriter(fw)) {
            bw.write("ABCDEFGあいうえお\n");
            bw.flush();
        } catch (IOException e){
        }
        try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
            String s = br.readLine();
            System.out.println(s);
        } catch (IOException e){
        }
    }
}
try-with-resourceのtry()の中は複数行記述できます。それぞれのリソースのクローズは適切に行われます。

Fileクラスでのファイルの指定

import java.io.*;

class File08
{
    public static void main(String[] args)
    {
        File f = new File("test.txt");
        try (FileWriter fw = new FileWriter(f);
            BufferedWriter bw = new BufferedWriter(fw)) {
            bw.write("ABCDEFGあいうえお\n");
            bw.flush();
        } catch (IOException e){
        }
    }
}
各種クラスのコンストラクタに指定するファイルはパス名を文字列で指定できますが、Fileクラスのインスタンスでも指定できます。