【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 ファイル権限<br>第2引数なしバージョン<br>Files.createFile(Path p1);<br>第2引数ありバージョン<br>Files.createFile(Path p1, PosixFilePermissions.asFileAttribute(EnumSet.of(OWNER_READ, …)));<br>or<br>PosixFilePermissions.asFileAttribute(PosixFilePermissions.fromString(“r—r—r—“)));|
|Files.createDirectory(Path path, FileAttribute attrs...) |新規ディレクトリ作成<br>※親ディレクトリがないとエラー |
|Files.createDirectories(Path path, FileAttribute attrs...) |新規ディレクトリ作成<br>※親ディレクトリがなければ勝手に作る |
|Files.delete(Path path) |ファイルorディレクトリの削除<br>※ディレクトリ内は空でないと例外発生 |
|Files.deleteIfExists(Path path) |ファイルorディレクトリの削除<br>※対象ファイルがあったら消すけど、なかったら例外発生せずfalse返して終わる。 |
|Files.move(Path fromPath, Path toPath, CopyOption options) |ファイルの移動/リネーム |
|Files.exists(Path path, LinkOption options) |ファイルの存在有無の確認<br>LinkOption.NO_FOLLOW_LINK→シンボリックリンクをたどらない |

## ファイル読み書き系
|メソッド  |機能  |
|---|---|
|Files.newInputStream(Path path) |Pathオブジェクト→InputStreamの作成<br>ファイル内の文字をプログラム内で参照する時に使える。 |
|Files.newOutputStream(Path path) |Pathオブジェクト→OutputStreamの作成<br>ファイルに書き出す時に利用できる。 |
|Files.newBufferedReader(Path path) |直でBufferedReaderを呼べる代物。<br>デフォルトで文字コードはUTF-8。<br>=前だったら=<br>new BufferedReader(new FileReader(new File("----")))<br>=これだと=<br>Files.newBufferedReader(Path.get("----")) シンプルで良い。 |
|Files.newBufferedReader(Path oath, Charset charset) |↑の文字コード指定するバージョン<br>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<PosixFIlePermission> set); |既存ファイルの権限設定|
|Files.size(Path path) |ファイルの容量の取得 |
|Files.isReadable<br>Files.isWritable<br>Files.isExecutable |JVMが〇〇可能か |

## streamを使う系
|メソッド  |機能  |
|---|---|
|Files.walk(Path path)<br>Files.list(Path path)  |ディレクトリ内のエントリを全て取得  |
|Files.walk(Path path, int maxDepth)  |調べる階層数を指定して、ディレクトリ内のエントリを取得 |
|Files.find(Path path, int maxDepth, BiPredicate matcher) |ディレクトリ内で指定した条件に該当するエントリのみ取得<br>BiPredicate 第１引数はPathオブジェクト、第２引数はFileAttiributeを示す<br>Files.find(dir, Integer.MAX_VALUE, (p, attr) -> p.toFile().getName().endsWith(".png")).forEach(System.out::println);|
|Files.lines(Path path) |○○Readerとか書かずに中身をStreamで取り出せる<br>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インタフェース](https://spring.pleiades.io/spring-framework/docs/current/javadoc-api/org/springframework/core/io/Resource.html)が提供されている。実装クラスとして「ClassPathResource」と「FileSystemResource」を利用可能。
## ClassPathResource
```java
Resource resource = new ClassPathResource("src/main/resources/file/sample_file_1.txt");
```
## FileSystemResource
```java
Path path = Path.of("src/main/resources/file/sample_file_1.txt");
Resource resource = new FileSystemResource(path);
```

## Resourceインタフェースで提供しているメソッド
```java
resource.getFile() -> Fileオブジェクト内を返す
resource.getInputStream() -> InputStreamオブジェクトを返す
resource.getURL() -> URLオブジェクトを返す
// 他にもいろいろある
```

## ファイルダウンロード時にResourceインタフェースを利用する

https://qiita.com/crml1206/items/7166d3ffbd5cf2152eec