0
Help us understand the problem. What are the problem?

posted at

【Java】ファイル操作関連

まえがき

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インタフェースを利用する

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
0
Help us understand the problem. What are the problem?