十六、Java NIO Files
所有文章
https://www.cnblogs.com/lay2017/p/12901123.html
正文
NIO的Files提供了操作系统文件的方法,Files经常和Path协作使用,所以在本文之前了解Path是比较有帮助的。
Files.exists
exists方法用于检测Path是否存在于文件系统中
Path path = Paths.get("data/logging.properties");
boolean pathExists = Files.exists(path, new LinkOption[]{ LinkOption.NOFOLLOW_LINKS});
注意到exists有一个参数LinkOption数组,LinkOption参数用于自定义一些校验文件是否存在的逻辑。
以LinkOption.NOFOLLOW_LINKS为例,有的文件系统支持以链接地址作为目录,那么当Path存在链接地址的时候,将会检测为cannot be detemined,结果返回false。
Files.createDirectory
创建目录
Path path = Paths.get("data/subdir");
try {
Path newDir = Files.createDirectory(path);
} catch(FileAlreadyExistsException e){
// the directory already exists.
} catch (IOException e) {
//something else went wrong
e.printStackTrace();
}
Files.copy
文件拷贝
Path sourcePath = Paths.get("data/logging.properties");
Path destinationPath = Paths.get("data/logging-copy.properties");
try {
Files.copy(sourcePath, destinationPath);
} catch(FileAlreadyExistsException e) {
//destination file already exists
} catch (IOException e) {
//something else went wrong
e.printStackTrace();
}
文件拷贝如何目标文件已经存在会抛出异常,如果你想覆盖目标文件
Path sourcePath = Paths.get("data/logging.properties");
Path destinationPath = Paths.get("data/logging-copy.properties");
try {
Files.copy(sourcePath, destinationPath, StandardCopyOption.REPLACE_EXISTING);
} catch(FileAlreadyExistsException e) {
//destination file already exists
} catch (IOException e) {
//something else went wrong
e.printStackTrace();
}
Files.move
文件移动,和copy类似
Path sourcePath = Paths.get("data/logging-copy.properties");
Path destinationPath = Paths.get("data/subdir/logging-moved.properties");
try {
Files.move(sourcePath, destinationPath, StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {
//moving file failed.
e.printStackTrace();
}
Files.delete
Path path = Paths.get("data/subdir/logging-moved.properties");
try {
Files.delete(path);
} catch (IOException e) {
//deleting file failed
e.printStackTrace();
}
Files.walkFileTree
walkFileTee用于递归遍历Path,使用方法就是调用walkFileTree,并传入两个参数:
1:path:表示要递归哪个目录
2:FileVisitor:访问者,访问文件(了解一下访问者模式比较容易理解这个点)
示例代码如下
Files.walkFileTree(path, new FileVisitor<Path>() { @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { System.out.println("pre visit dir:" + dir); return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { System.out.println("visit file: " + file); return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { System.out.println("visit file failed: " + file); return FileVisitResult.CONTINUE; } @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { System.out.println("post visit directory: " + dir); return FileVisitResult.CONTINUE; } });
访问者包含了4个方法:
1)preVisitDirectory:访问前回调
2) visitFile:访问回调
3)visitFileFailed:访问失败回调
4)postVisitDirectory:访问后回调
这四个方法需要你返回FileVisitResult,表示下一步怎么执行,FileVisitResult有几个可选项
1)CONTINUE:继续执行
2)TERMINATE:停止执行
3)SKIP_SIBLINES:跳过同级
4)SKIP_SUBTEE:跳过当前目录的子级
下面是一个用walkFileTree搜索README.txt文件的示例代码
Path rootPath = Paths.get("data");
String fileToFind = File.separator + "README.txt";
try {
Files.walkFileTree(rootPath, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
String fileString = file.toAbsolutePath().toString();
//System.out.println("pathString = " + fileString);
if(fileString.endsWith(fileToFind)){
System.out.println("file found at path: " + file.toAbsolutePath());
return FileVisitResult.TERMINATE;
}
return FileVisitResult.CONTINUE;
}
});
} catch(IOException e){
e.printStackTrace();
}
下面是一个用walkFileTree递归删除文件和目录的示例
Path rootPath = Paths.get("data/to-delete");
try {
Files.walkFileTree(rootPath, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
System.out.println("delete file: " + file.toString());
Files.delete(file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
Files.delete(dir);
System.out.println("delete dir: " + dir.toString());
return FileVisitResult.CONTINUE;
}
});
} catch(IOException e){
e.printStackTrace();
}
Files还包含了很多其它的有用的方法,可以查看java.nio.file.Files的类
浙公网安备 33010602011771号