java nio 用法
package com.example.javademo.file;
import com.example.javademo.JavaDemoApplicationTests;
import org.junit.Test;
import org.springframework.util.FileSystemUtils;
import java.io.File;
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Arrays;
public class PathTest extends JavaDemoApplicationTests {
/**
* 创建目录
* @throws IOException
*/
@Test
public void createDirectory() throws IOException {
//获取path直接创建 C:/test
System.out.println(Files.createDirectory(Paths.get("C:/test")));
//创建多层次的目录 可以在path之后添加路径 C:/test/tt
System.out.println(Files.createDirectories(Paths.get("C:/test/aa").resolve("tt")));
/**
* 创建临时目录: 历史目录是在你的系统中个人用户的临时文件夹下创建
*/
//如果不加系统根目录 ,默认添加到系统用户的临时文件中 C:UserslcmAppDataLocalTempaa4464090953349324592
System.out.println(Files.createTempDirectory("aa"));
// 1. 添加了根目录就会在根目录下生成文件 C: est em8169131100444631705.txt 2.如果不添加first 那么就会在项目根目录下创建一个文件 tem2136575820052041908.txt
System.out.println(Files.createTempFile(Paths.get("/test"),"tem",".txt"));
}
/**
* 删除目录
* @throws IOException
*/
@Test
public void deleteDirectory() throws IOException {
/*//普通删除一个目录
Files.delete(Paths.get("C:/test/aa/tt"));*/
//删除指定目录 如果存在就删除,只能删除空的目录
File file = new File("C:/test/aa");
if (file.isFile()){
file.delete();
}
Arrays.asList(file.listFiles()).forEach(FileSystemUtils::deleteRecursively);
//System.out.println(Files.deleteIfExists(Paths.get("C:/test/aa")));
}
/**
* 获取指定目录下的所有文件 Files.list() Files.lines()
* @throws IOException
*/
@Test
public void list() throws IOException {
//获取该目录下的所有的文件
Files.list(Paths.get("C:/test")).forEach(s->{
System.out.println(s.getFileName());
System.out.println(s);
});
}
/**
* 判断系统文件是否存在
* @throws IOException
*/
@Test
public void exists() throws IOException {
//其中第二个参数是如何确定该文件是否存在,LinkOption.NOFOLLOW_LINKS 说明不应该在文件系统中跟踪符号链接来判断是否文件存在
System.out.println(Files.exists(Paths.get("C:/isExists"),new LinkOption[]{LinkOption.NOFOLLOW_LINKS} ));
}
/**
* 复制文件
* @throws IOException
*/
@Test
public void copy() throws IOException {
//第一个参数是源文件 ,第二个参数目的文件,第三个参数是移动的方式取值有三个, COPY_ATTRIBUTES讲属性复制到新的文件,REPLACE_EXISTING如果目标文件存在就覆盖,ATOMIC_MOVE讲源文件一原子的操作进行移动到目标位置
System.out.println(Files.copy(Paths.get("C:/test/aa/tt/新建 RTF 文档.rtf"),Paths.get("C:/test/aa/ff/新建 RTF 文档.rtf"), StandardCopyOption.COPY_ATTRIBUTES));
}
/**
* 移动文件到指定的目录下
* @throws IOException
*/
@Test
public void move() throws IOException {
System.out.println(Files.move(Paths.get("C:/test/aa/tt/新建 DOC 文档.doc"),Paths.get("C:/test/aa/ff/新建 DOC 文档.doc"),StandardCopyOption.ATOMIC_MOVE));
}
/**
*遍历制定路径下的所有文件夹和文件以及子文件夹和子文件
* 四个方法:
* preVisitDirectory 进入文件夹之前
* visitFile 正在访问文件时、
* visitFileFailed 文件访问失败时
* postVisitDirectory 从文件下出来后
* @throws IOException
*/
@Test
public void walkFileTree() throws IOException {
Files.walkFileTree(Paths.get("C:/test"), new FileVisitor<Path>() {
//
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
if (Files.list(dir).count()<0){
return FileVisitResult.SKIP_SUBTREE;
}
System.out.println(dir);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
System.out.println(file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
System.out.println(file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
System.out.println(dir);
return FileVisitResult.CONTINUE;
}
});
}
}