nioでメタデータとデータを取得する方法が意外だったので書く
ファイルの構造
dir, dir\file1.txt, dir\file2.txt, dir\nestDir, dir\nestDir\nestFile.txt
import java.io.BufferedReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Map;
public class Main {
public static void main(String[] args) throws IOException {
Path dirPath = Paths.get("dir");
System.out.println("list");
Files.list(dirPath).forEach(path -> {
try {
readMetaDataAndData(path);
} catch (IOException e) {
e.printStackTrace();
}
});
System.out.println("walk");
Files.walk(dirPath).forEach(path -> {
try {
readMetaDataAndData(path);
} catch (IOException e) {
e.printStackTrace();
}
});
}
private static void readMetaData(Path path) throws IOException {
Map<String, Object> map = Files.readAttributes(path, "*");
map.forEach((key, value) -> System.out.println(key + ":" + value));
}
private static void readData(Path path) throws IOException {
try (BufferedReader reader = Files.newBufferedReader(path)) {
reader.lines()
.forEach(System.out::println);
}
}
private static void readMetaDataAndData(Path path) throws IOException {
System.out.println(path);
System.out.println();
System.out.println("meta data");
readMetaData(path);
if (!Files.isDirectory(path)) {
System.out.println();
System.out.println("data");
readData(path);
}
System.out.println();
System.out.println();
}
}
出力
list
dir\file1.txt
meta data
lastAccessTime:2018-12-31T15:18:53.115459Z
lastModifiedTime:2018-12-31T15:18:53.115459Z
size:12
creationTime:2018-12-31T15:04:14.196592Z
isSymbolicLink:false
isRegularFile:true
fileKey:null
isOther:false
isDirectory:false
data
file1 sample
dir\file2.txt
meta data
lastAccessTime:2018-12-31T15:19:01.498545Z
lastModifiedTime:2018-12-31T15:19:01.499543Z
size:10
creationTime:2018-12-31T15:04:23.007369Z
isSymbolicLink:false
isRegularFile:true
fileKey:null
isOther:false
isDirectory:false
data
file2 data
dir\nestDir
meta data
lastAccessTime:2018-12-31T15:23:56.735169Z
lastModifiedTime:2018-12-31T15:23:56.735169Z
size:0
creationTime:2018-12-31T15:23:34.69674Z
isSymbolicLink:false
isRegularFile:false
fileKey:null
isOther:false
isDirectory:true
walk
dir
meta data
lastAccessTime:2018-12-31T15:23:34.69674Z
lastModifiedTime:2018-12-31T15:23:34.69674Z
size:0
creationTime:2018-12-31T15:04:07.017102Z
isSymbolicLink:false
isRegularFile:false
fileKey:null
isOther:false
isDirectory:true
dir\file1.txt
meta data
lastAccessTime:2018-12-31T15:18:53.115459Z
lastModifiedTime:2018-12-31T15:18:53.115459Z
size:12
creationTime:2018-12-31T15:04:14.196592Z
isSymbolicLink:false
isRegularFile:true
fileKey:null
isOther:false
isDirectory:false
data
file1 sample
dir\file2.txt
meta data
lastAccessTime:2018-12-31T15:19:01.498545Z
lastModifiedTime:2018-12-31T15:19:01.499543Z
size:10
creationTime:2018-12-31T15:04:23.007369Z
isSymbolicLink:false
isRegularFile:true
fileKey:null
isOther:false
isDirectory:false
data
file2 data
dir\nestDir
meta data
lastAccessTime:2018-12-31T15:23:56.735169Z
lastModifiedTime:2018-12-31T15:23:56.735169Z
size:0
creationTime:2018-12-31T15:23:34.69674Z
isSymbolicLink:false
isRegularFile:false
fileKey:null
isOther:false
isDirectory:true
dir\nestDir\nestFile.txt
meta data
lastAccessTime:2018-12-31T15:23:56.735169Z
lastModifiedTime:2018-12-31T15:23:56.735169Z
size:20
creationTime:2018-12-31T15:23:43.522588Z
isSymbolicLink:false
isRegularFile:true
fileKey:null
isOther:false
isDirectory:false
data
data in nestFile.txt
Files#listだと直下のファイル・ディレクトリのみだけどFiles#walkだとその下まで見てくれるので便利
メタデータで別れているので取得しやすい
FileのオブジェクトではなくFiles,Pathsという操作用のメソッドを用意されていて最初は戸惑うけど使っていくとパッケージにまとまっているし使いやすく感じた