Java ファイル操作

ファイル操作について調べてみた

インスタンスの生成

Path path = Paths.get("C:\\test.txt");
System.out.println(path);

File file = new File("C:\\test.txt");
Path path = file.toPath();
System.out.println(path);

・パス指定

// 絶対パス
Path path = Paths.get("C:\\test.txt");
System.out.println(path);
System.out.println(path.isAbsolute()); // true

// 相対パス
String dir = System.getProperty("user.dir");
System.out.println(dir);
Path path = Paths.get("test.txt");
System.out.println(path.toAbsolutePath()); // dir/path
System.out.println(path.isAbsolute()); // false

// 正規化
Path path = Paths.get("C:\\dir1", "..\\dir2", "test.txt");
System.out.println(path);             // C:\dir1\..\dir2\test.txt
System.out.println(path.normalize()); // C:\dir2\test.txt

・存在チェック file directory共通

Path path = Paths.get("C:\\dir");
System.out.println(Files.exists(path));
System.out.println(Files.notExists(path));

・更新日時/ファイルサイズの取得

Path path = Paths.get("C:\\test.txt");
System.out.println(Files.getLastModifiedTime(path));
System.out.println(Files.size(path));
// 対象が存在しない場合 NoSuchFileException

ディレクトリ判定

Path path = Paths.get("C:\\dir");
System.out.println(Files.isDirectory(path)); // ディレクトリであればtrue
// 対象が存在しない場合 false

ディレクトリの作成

Path path = Paths.get("C:\\dir1\\dir2");
Files.createDirectory(path);   // 親ディレクトリがない場合 NoSuchFileException
Files.createDirectories(path); // 親ディレクトリがない場合 作成
// ディレクトリが既に存在しても例外は起きない

・ファイルの作成

Path path = Paths.get("C:\\dir\\test.txt");
System.out.println(Files.createFile(path));
// 親ディレクトリがない場合 NoSuchFileException
// ファイルが既に存在する場合 FileAlreadyExistsException

・ファイルの読み込み

Path path = Paths.get("C:\\dir\\test.txt");

// バイト
byte[] bytes = Files.readAllBytes(path);

// 文字列
Files.readAllLines(path).stream().forEach(System.out::println); 

// バッファリング
BufferedReader reader = Files.newBufferedReader(path);
reader.lines().forEach(System.out::println);
// 対象が存在しない場合いずれも NoSuchFileException

・ファイルの書き込み

Path path = Paths.get("C:\\dir\\test.txt");
String line = "line";

Files.write(path, line.getBytes());

// バッファリング
BufferedWriter writer = Files.newBufferedWriter(path);
writer.write(line, 0, line.length());
writer.newLine();
writer.flush();

// ディレクトリが存在しない場合 NoSuchFileException
// ファイルが存在しない場合 ファイルが作成される

・ファイルのコピー

Path src = Paths.get("C:\\dir\\test1.txt");
Path dest = Paths.get("C:\\dir\\test2.txt");

Files.copy(src, dest); // コピー先が存在する場合 FileAlreadyExistsException
Files.copy(src, dest, StandardCopyOption.REPLACE_EXISTING); // コピー先が存在する場合上書き
// コピー元が存在しない場合 NoSuchFileException

・ファイルの移動

Path src = Paths.get("C:\\dir\\test1.txt");
Path dest = Paths.get("C:\\dir\\test2.txt");

Files.move(src, dest); // 移動先が存在する場合 FileAlreadyExistsException
Files.move(src, dest, StandardCopyOption.REPLACE_EXISTING); // 移動先が存在する場合上書き
// 移動元が存在しない場合 NoSuchFileException

・ファイルの削除

Path path = Paths.get("C:\\dir1\\test1.txt");

Files.delete(path); // 削除対象が存在しない場合 NoSuchFileException
Files.deleteIfExists(path); // 削除に成功した場合にtrue返却 削除対象がなくても例外は発生しない

・ファイル検索

Path path = Paths.get("C:\\dir");

// 所定ディレクトリ内の検索
Files.list(path).forEach(System.out::println); // パスがディレクトリでない場合 NotDirectoryException

// 再帰検索
Files.walk(path).forEach(System.out::println); // パスがファイルでも動作

// 条件付き検索
Files.find(path, Integer.MAX_VALUE, (i, j) -> i.toString().contains("txt")).forEach(System.out::println); // パスがファイルでも動作

// ディレクトリが存在しない場合 NoSuchFileException

・テンポラリ作成

Path path = Paths.get("C:\\dir");

// 一時ディレクトリ
Files.createTempDirectory(path, "tmp_"); // ex tmp_9194118049955059353

// 一時ファイル
Files.createTempFile(path, "tmp_", ".csv"); // ex tmp_2871683714486788849.csv

// ディレクトリが存在しないやファイルを指定した場合 NoSuchFileException