[Java] 入出力ストリーム

Javaの入出力ストリームについてまとめていきます。

Fileクラス

Fileクラスは、Java1.0の最初期からあるAPIで、ファイルやディレクトリのパスを表すクラスです。

  • あくまでパスを扱っているだけで、ファイルやディレクトリそのものを扱っているわけではない。

Fileオブジェクトの取得

コード例

File file = new File("output/data.txt");

この時オブジェクトはファイルパスを扱っているだけなので、output/data.txtの存在有無や書き込み権限にかかわらず、インスタンスを生成することが可能です。

Fileオブジェクトの主なメソッド

boolean isFile() ファイルの場合にTrueを返す。
boolean isDirectory() ディレクトリの場合にTrueを返す。
long lastModified() ファイルの更新日付をUNIXタイムで返す。
String getAbsolutePath() ファイルの絶対パスを取得する。
String getCanonicalPath() ファイルの相対パスを取得する。
File[] listFiles() ディレクトリ配下のFileオブジェクトの配列を生成する。
File[] listFiles(FileFilter) FileFilter関数型インターフェースを引数に取り、条件に一致したFileオブジェクトの配列を生成する。

サンプル

コード例

  • output配下の拡張子が「.txt」のファイル一覧を取得
  • ファイル名と最終更新日時を出力する
File file = new File("output");
FileFilter filter = pathname -> pathname.getName().endsWith(".txt");
File[] files = file.listFiles(filter);

Arrays.stream(files).forEach(x -> {
    if (x.isFile()) {
        System.out.println(x.getName() + " " + new Date(x.lastModified()));
    }
});

実行結果

data1.txt Sun Nov 20 22:46:22 JST 2022
data2.txt Sun Nov 20 22:46:33 JST 2022
data3.txt Sun Nov 20 22:46:45 JST 2022

FileReaderクラス

FileReaderクラスは、文字ストリームの入力を扱うReaderクラスを継承し、ファイルから文字ストリームを読み込むクラスです。

FileReaderオブジェクトの取得

FileReaderのコンストラクタから取得

FileReader reader = new FileReader("output/data1.txt");

readメソッド

readメソッドはReaderクラスからオーバーライドされたメソッドで、ファイルから1文字ずつint型で取得します。ファイルの終端まで取得したら-1が返却されます。

コード例

try (FileReader reader = new FileReader("output/data1.txt");) {
    int c;
    while ((c = reader.read()) != -1) {
        System.out.print((char) c);
    }
}

実行結果1

1,aaaaa,30,xxxxxxxxxxx
2,bbbbb,24,yyyyyyyyyyyyyy
3,ccccc,26,zzzzzzzzzzzz

実行結果2

読み込み対象ファイルが存在しない場合は実行時例外[FileNotFoundException]が発生します。

Exception in thread "main" java.io.FileNotFoundException:
    output\data12.txt (指定されたファイルが見つかりません。)

BufferedReaderクラス

FileReaderクラスは一文字ずつ読み込み処理を行いますが、これではパフォーマンスや使い勝手に少々問題があります。これに対して文字列をバッファにため込み、1行ずつ読み込むことを可能にしたのがBufferedReaderクラスです。

BufferdReaderオブジェクトの取得

BufferdReaderクラスのコンストラクタから取得

引数にFileReaderのオブジェクトを指定します。

FileReader fileReader = new FileReader("output/data1.txt");
BufferedReader bufferedReader = new BufferedReader(fileReader);

readLineメソッド

readLineメソッドはファイルから改行コードを含まない1行を読み込みます。ファイルの終端に達した場合はnullが返却されます。

コード例

try (
        FileReader fileReader = new FileReader("output/data1.txt");
        BufferedReader bufferedReader = new BufferedReader(fileReader);
) {
    String line;
    while ((line = bufferedReader.readLine()) != null) {
        System.out.print(line);
    }
}

実行結果

1,aaaaa,30,xxxxxxxxxxx2,bbbbb,24,yyyyyyyyyyyyyy3,ccccc,26,zzzzzzzzzzzz

readLineメソッドは改行コードを含めない文字列を取り出しているので、出力した結果は複数行が1行で表示されています。

FileWriterクラス

FileWriterクラスは、文字ストリームの出力を扱うWriterクラスを継承し、文字ストリームをファイルに出力するクラスです。

FileWriterオブジェクトの取得

FileWriterのコンストラクタから取得

FileWriter witer = new FileWriter("output/data2.txt");

FileWriterのコンストラクタの第二引数にtrueを指定すると追記モードになります。デフォルトはfalseです。

writeメソッド

writeメソッドはWriterクラスからオーバーライドされたメソッドで、文字ストリームをファイルに出力します。指定できる方はchar型、String型が指定できます。

コード例

try (FileWriter writer = new FileWriter("output/data2.txt");) {
    writer.write('a');
    writer.write('\n');
    writer.write("bbbbb");
}

実行結果1

$ cat output/data2.txt
a
bbbbb

実行結果2

指定したファイルに書き込み権限がない場合、実行時例外[FileNotFoundException]が発生します。

Exception in thread "main" java.io.FileNotFoundException:
    output\data2.txt (アクセスが拒否されました。)

BufferedWriterクラス

BufferedReaderクラスのように、バッファを利用してファイルの書き込みを行うのがBufferedWriterクラスです。BufferedWriterクラスを使うとFileWriterに比べて効率的な書き込みができるようになります。

BufferdWriterオブジェクトの取得

BufferdWriterクラスのコンストラクタから取得

引数にFileWriterのオブジェクトを指定します。

FileWriter fileWriter = new FileWriter("output/data2.txt");
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);

wirte、newLine、flushメソッド

writeメソッドはFileWriterのwriteメソッドとほぼ同様の動きをします。違う点はBufferedWriterのwriteメソッドはファイルに直接書き込まず、一旦バッファに書き込みをし、JVMが自動でバッファとファイルの同期を行います。

flushメソッドは、バッファの内容とファイルの内容を強制的に同期させます。

newLineメソッドは実行環境(OS)の改行コードを自動的に判別して、適切な改行コードを出力します。

コード例

try (
        FileWriter fileWriter = new FileWriter("output/data2.txt");
        BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
) {
    bufferedWriter.write('a');
    bufferedWriter.newLine();
    bufferedWriter.write("bbbbb");
    bufferedWriter.flush();
}

実行結果

$ cat output/data2.txt
a
bbbbb

コメント

このブログの人気の投稿

docker-compose up で proxyconnect tcp: dial tcp: lookup proxy.example.com: no such host

docker-compose で起動したweb、MySQLに接続できない事象

【PHP】PHP_CodeSnifferを使う(コーディングルールのカスタマイズ)