[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
コメント
コメントを投稿