下文主要是一些处理文件相关的api,
Path
JDK7引入的Path和Paths类,Path用来表示文件路径,Paths是一个工具类 用来获取Path实例对象
Path source = Paths.get("D:\\aaa\\bb...");
Path source = Paths.get("D:/aaa/bb...");
Path source = Paths.get("D:\\aaa","bb"); // 这里这表示D://aaa//bb
// 输出正常的文件路径
System.out.printlb(path.normalize());
Path 也支持 . 和 … 表示当前路径与上一级路径
Files
检查文件或文件夹是否存在:Files.exists(Path path)
创建一级目录:Files.createDirectory(Paths.get("E:\\1bbb\\测试创建文件夹"))
,如果目录已经存在或者是创建多级目录是会有异常的。
创建多级目录:Files.creatDirectories(Path path)
拷贝文件:Files.copy(Path source , Path target)
;第一个参数就是原文件,第二个参数就是拷贝到哪去,如果文件已经存在也会抛异常。
Path source = Paths.get("E:\\1bbb\\照片\\2852CF8E7B2523436666674951FA17BE.jpg");
Path target = Paths.get("E:\\1bbb\\测试创建文件夹\\testCopy.jpg");
Files.copy(source,target);
如果希望即使target文件已经存在,但还是想要source替换掉target可以在copy()方法中加一个参数
Files.copy(source,target, StandardCopyOption.REPLACE_EXISTING);
移动文件 StandardCopyOption.ATOMIC_MOVE
参数保证文件移动时的原子性
Path source = Paths.get("E:\\1bbb\\照片\\2852CF8E7B2523436666674951FA17BE.jpg");
Path target = Paths.get("E:\\1bbb\\照片\\2852CF8E7B2523436666674951FA17BE.jpg");
Files.move(source,target, StandardCopyOption.ATOMIC_MOVE);
删除文件:Files.delete(Path path)
如果文件不存在会抛异常
删除目录: 也是调用delete()方法,但是如果文件夹中有内容的话会报异常,只能删除空文件夹
遍历目录:
package com.hs.netty.file;
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
/**
* 测试Fils工具类操作文件
* @author hs
* @date 2021/07/11
*/
public class FilesTest {
public static void main(String[] args) throws IOException {
Path source = Paths.get("C:\\Program Files\\Java\\jdk1.8.0_231");
// walkFileTree(参数1是要遍历的目录Path对象,参数2是遍历后要执行的操作)
Path path = Files.walkFileTree(source, new SimpleFileVisitor<Path>() {
/**
* 注意下面重写的方法 返回值不要变 就这样写
* 进入到该目录之前执行的方法
*/
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
System.out.println("---> 进入目录:" + dir);
return super.preVisitDirectory(dir, attrs);
}
/**
* 遍历文件夹中的每个文件时执行的方法
*/
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
System.out.println("文件:" + file);
return super.visitFile(file, attrs);
}
/**
* 遍历文件执行失败执行的方法
*/
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
return super.visitFileFailed(file, exc);
}
/**
* 文件遍历完后 执行的方法
*/
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
System.out.println("<-----退出目录:" + dir );
return super.postVisitDirectory(dir, exc);
}
});
}
}
如果要删除一个多级目录,那就可以先在重写的visitFile()方法中删除每个文件,然后在重写的postVisitDirectory()方法中删除文件夹。
如果要拷贝一个文件夹,那就可以先在preVisitDirectory()方法中在要生成的位置创建一个文件夹,然后在重写的visitFile()方法中copy每个文件。但是这里有一个路径字符串替换的问题,需要在创建文件夹和复制文件时要把原路径字符串替换成新的要生成的路径,
就比如原始路径是E:\1bbb\照片
,拷贝后的路径是D:\aa\bb
创建是文件夹就要从E:\1bbb\照片\image
改为 D:\aa\bb\image
。 就是需要把原始路径的前面一部分替换成新路径。