まえがき
Javaではファイル操作関連クラスが豊富に提供されている。それぞれのクラスの役割/使い方についてまとめる。
java.io と java.nio と java.nio2
JDK6/SE6:io系(File)
JDK7/SE7:nio系(Files, Path)
JDK8/SE8:nio2系(nioの強化)+ Stream + ラムダ式 + メソッド参照
SE → JavaAPI群。JDKの一部品。
JDK → Java開発プログラムのセット(ソフトウェア)
JDK6/SE6:io系(File)
File
・ファイルの置き場所を定義する
・ファイルを操作する
JDK7/SE7:nio系(Files, Path)
Path
・ファイルの置き場所を定義する
Files
・ファイルを操作する
Fileクラスの2機能を、PathクラスとFilesクラスで分割したような形。
Fileクラスにはない便利機能がPathとFilesにはあるので、JDK7/SE7以上の環境である場合は
✕ Fileクラス
〇 Pathクラス&Filesクラス
の組み合わせで利用するとBETTERなコーディングができるだろう👍
Filesクラスの便利なやつ
ファイル作成/コピー/削除系
メソッド | 機能 |
---|---|
Files.copy(Path fromPath, Path toPath) | コピー |
Files.createFile(Path path, FileAttribute attr) | 新規ファイル作成 with ファイル権限 第2引数なしバージョン Files.createFile(Path p1); 第2引数ありバージョン Files.createFile(Path p1, PosixFilePermissions.asFileAttribute(EnumSet.of(OWNER_READ, …))); or PosixFilePermissions.asFileAttribute(PosixFilePermissions.fromString(“r—r—r—“))); |
Files.createDirectory(Path path, FileAttribute attrs...) | 新規ディレクトリ作成 ※親ディレクトリがないとエラー |
Files.createDirectories(Path path, FileAttribute attrs...) | 新規ディレクトリ作成 ※親ディレクトリがなければ勝手に作る |
Files.delete(Path path) | ファイルorディレクトリの削除 ※ディレクトリ内は空でないと例外発生 |
Files.deleteIfExists(Path path) | ファイルorディレクトリの削除 ※対象ファイルがあったら消すけど、なかったら例外発生せずfalse返して終わる。 |
Files.move(Path fromPath, Path toPath, CopyOption options) | ファイルの移動/リネーム |
Files.exists(Path path, LinkOption options) | ファイルの存在有無の確認 LinkOption.NO_FOLLOW_LINK→シンボリックリンクをたどらない |
ファイル読み書き系
メソッド | 機能 |
---|---|
Files.newInputStream(Path path) | Pathオブジェクト→InputStreamの作成 ファイル内の文字をプログラム内で参照する時に使える。 |
Files.newOutputStream(Path path) | Pathオブジェクト→OutputStreamの作成 ファイルに書き出す時に利用できる。 |
Files.newBufferedReader(Path path) | 直でBufferedReaderを呼べる代物。 デフォルトで文字コードはUTF-8。 =前だったら= new BufferedReader(new FileReader(new File("----"))) =これだと= Files.newBufferedReader(Path.get("----")) シンプルで良い。 |
Files.newBufferedReader(Path oath, Charset charset) | ↑の文字コード指定するバージョン Files.newBufferedReader(Path.get("----"), StandardCharsets.UTF-8); |
Files.newBufferedWriter(Path path) | |
Files.newBufferedWriter(Path, Charset charset) | |
Files.readAllLines(Path path) | 全行をList<String>で返す。 |
Files.readAllLines(Path path, Charset charset) | ↑の文字コード指定するバージョン。 |
ファイル情報操作系
メソッド | 機能 |
---|---|
Files.getPosixFilePermissions(Path path, LinkedOption …) | 既存ファイルの権限取得 |
Files.setPosixFilePermissions(Path path,Set set); | 既存ファイルの権限設定 |
Files.size(Path path) | ファイルの容量の取得 |
Files.isReadable Files.isWritable Files.isExecutable |
JVMが〇〇可能か |
streamを使う系
メソッド | 機能 |
---|---|
Files.walk(Path path) Files.list(Path path) |
ディレクトリ内のエントリを全て取得 |
Files.walk(Path path, int maxDepth) | 調べる階層数を指定して、ディレクトリ内のエントリを取得 |
Files.find(Path path, int maxDepth, BiPredicate matcher) | ディレクトリ内で指定した条件に該当するエントリのみ取得 BiPredicate 第1引数はPathオブジェクト、第2引数はFileAttiributeを示す Files.find(dir, Integer.MAX_VALUE, (p, attr) -> p.toFile().getName().endsWith(".png")).forEach(System.out::println); |
Files.lines(Path path) | ○○Readerとか書かずに中身をStreamで取り出せる Files.lines(path).forEach(System.out::println); |
Reader, Writer, InputStream, OutputStreamらへんの整理
=古いとされるやつ=
・FileInputStream ~バイト~
・FileOutputStream ~バイト~
・FileReader ~文字列~
・FileWriter ~文字列~
=新しいとされるやつ=
・BufferedInputStream ~バイト~
・BufferedOutputStream ~バイト~
・InputStreamReader バイト→文字列にして読み込む
・OutputStreamWriter バイト→文字列にして読み込む
・BufferedReader 文字列
・BufferedWriter 文字列
✅ 7から提供されている「バッファ」を使うために、古いやつを新しいやつでラップして使う。
✅ 既存ファイルをコピーする場合は「バイト→バイト」でOK.
org.springframework.core.io.Resourceクラスを使う
Spring Frameworkでは、ファイル・クラスパス(src/main/resources等)配下のリソースにアクセスするためにResourceインタフェースが提供されている。実装クラスとして「ClassPathResource」と「FileSystemResource」を利用可能。
ClassPathResource
Resource resource = new ClassPathResource("src/main/resources/file/sample_file_1.txt");
FileSystemResource
Path path = Path.of("src/main/resources/file/sample_file_1.txt");
Resource resource = new FileSystemResource(path);
Resourceインタフェースで提供しているメソッド
resource.getFile() -> Fileオブジェクト内を返す
resource.getInputStream() -> InputStreamオブジェクトを返す
resource.getURL() -> URLオブジェクトを返す
// 他にもいろいろある
ファイルダウンロード時にResourceインタフェースを利用する