1.Path
- Paths.get(String first,String... more):通过连接给定的字符串创建一个路径。
- resolve(Path other) 和 resolve(String more):如果other是绝对路径,那么就返回other;否则,返回通过连接this和other获得路径。
- resolveSibling(Path other)和resolveSibling(String other):如果other是绝对路径,那么就返回other;否则,返回通过连接this的父路径和other获得的路径。
- relativize(Path other):返回用this进行解析,相对于other的相对路径。
- normalize():移除诸如. 和.. 等冗余的路径元素。
- toAbsolutePath():返回与该路径等价的绝对路径。
- getParent():返回父路径,或者在该路径没有父路径时,返回null。
- getFileName():返回该路径的最后一个部件,或者在该路径没有任何部件时,返回null;
- getRoot():返回该路径的根部件,或者在该路径没有任何根部件时,返回null。
- toFile():从改路径中创建一个File对象。
//路径不必对应某个实际存在的文件,它仅仅只是一个抽象的名字序列。
Path path = Paths.get("D:","test","12");
System.out.println(path);
//path:D:\test\12
Path path = Paths.get("D:\\test","12");
System.out.println(path);
//D:\test\12
Path path = Paths.get("D:\\test","12");
Path test = path.resolve("123");
System.out.println(test);
//test:D:\test\12\123
Path resolveOther = path.resolve("D:\\test");
System.out.println(resolveOther);
//resolveOther:D:\test
Path resolveSibling = path.resolveSibling("34");
System.out.println(resolveSibling);
//resolveSibling:D:\test\34
Path resolveSiblingOther = path.resolveSibling("D:\\12");
System.out.println(resolveSiblingOther);
//resolveSiblingOther:D:\12
Path relativize = path.relativize(resolveOther);
System.out.println(relativize);
//relativize: ..
2.读写文件
| 选项 | 描述 |
|---|---|
| StandardOption; | 与newBufferedWriter,newInputStream,newOutputStream,write一起使用 |
| READ | 用于读取而打开 |
| WRITE | 用于写入而打开 |
| APPEND | 如果用于写入而打开,那么在文件末尾追加 |
| TRUNCATE_EXISTING | 如果用于写入而打开,那么移除已有内容 |
| CREATE_NEW | 创建新文件并且在文件已存在的情况下会创建失败 |
| CREATE | 自动在文件不存在的情况下创建新文件 |
| DELETE_ON_CLOSE | 当文件被关闭时,尽“可能”地删除该文件 |
| SPARSE | 给文件系统一个提示,标识该文件是稀疏的。 |
| DSYN/SYN | 要求对文件数据的每次更新都必须同步地写入到存储设备中 |
| 选项 | 描述 |
|---|---|
| StandardCopyOption; | 与copy,move一起使用 |
| ATOMIC_MOVE | 原子性的移动文件 |
| COPY_ATTRIBUTES | 复制文件的属性 |
| REPLACE_EXISTING | 如果目标已存在,则替换它 |
| 选项 | 描述 |
|---|---|
| LinkOption; | 与上面所有方法以及exists,isDirectory,isRegularFile等一起使用 |
| NOFOLLOW_LINKS | 不要跟踪符号链接 |
| 选项 | 描述 |
|---|---|
| FileVisitOption; | 与find,walk,walkFileTree一起使用 |
| FOLLOW_LINKS | 跟踪符号链接 |
Files类中提供了一些方法使得普通文件操作变得快捷。
static byte[] readAllBytes(Path):读取文件的所有内容。
byte[] byte = Files.readAllBytes(Paths.get("C:\\test"));
String content = new String(bytes, StandardCharsets.UTF_8 );static List<String> readAllLines(Path,charset):将文件当作行序列读入。
List<String> lines = Files.readAllLines(path,StandardCharsets.UTF_8);static Path write(Path path, byte[] bytes, OpenOption... options);
static Path write(Path path,Iterable<? extends CharSequence> lines,OpenOption... options)
Files.write(Path path, Iterable<? extends CharSequence> lines,Charset cs, OpenOption... options):将内容写入到文件中,并返回path;
//将一个字符串写入到文件
Files.write(path,content.getBytes(StandardCharsets.UTF_8));
//向指定文件追加内容
Files.write(path,content.getBytes(StandardCharsets.UTF_8), StandardOpenOption.APPEND);
//将一个行的集合写入到文件中
Files.write(path,lines,StandardCharsets.UTF_8,StandardOpenOption.APPEND);
以上的简便方法适用于处理中等长度的文本文件,如果要处理文件长度比较大,或者是二进制文件,那么还是应该使用输入\输出流或者读入器\或写出器。
- static InputStream newInputStream(Path path, OpenOption... options):获取输入流
- static OutputStream newOutputStream(Path path, OpenOption... options):获取输出流
- static BufferedReader newBufferedReader(Path path, Charset cs):获取读入器
- static BufferedReader newBufferedReader(Path path,Charset cs):获取写入器
InputStream in = Files.newInputStream(path,StandardOpenOption.READ);
OutputStream out = Files.newOutputStream(path,StandardOpenOption.WRITE);
Reader reader = Files.newBufferedReader(path);
Writer writer = Files.newBufferedWriter(path);
3.创建文件和目录
- static Path createFile(Path path, FileAttribute<?>... attrs):创建文件;如果文件已经存在,就会抛出异常。检查文件是否存在和创建文件是原子性的。
- static Path createDirectory(Path dir, FileAttribute<?>... attrs):创建目录;其中除了最后一个部件外,其他部分都必须是已存在的。
- static Path createDirectories(Path dir, FileAttribute<?>... attrs):创建目录,并且创建路径中的所有中间目录。
- tatic Path createTempFile(String prefix,String suffix,FileAttribute<?>... attrs)
- static Path createTempFile(Path dir,String prefix,String suffix,FileAttribute<?>... attrs):创建临时文件,如果未指定目录,默认是C:\Users\user\AppData\Local\Temp\
- static Path createTempDirectory(Path dir,String prefix,FileAttribute<?>... attrs)
- static Path createTempDirectory(String prefix,FileAttribute<?>... attrs):创建一个临时目录。若未指定path,默认的地址为C:\Users\user\AppData\Local\Temp\
Path dir = Files.createTempDirectory(path,"123");
System.out.println(dir);
//D:\test\123921793164291337226 临时目录会添加一个随机数
Path file = Files.createTempFile("","123");
System.out.println(file);
//C:\Users\liming\AppData\Local\Temp\4471255596661424121123
//临时文件默认的存放路径为C:\Users\liming\AppData\Local\Temp
4.复制、移动和删除文件
- static void delete(Path path):删除给定文件或空目录。如果文件不存在会出现异常
- static boolean deleteIfExists(Path path):如果文件或空目录存在则删除
- static Path move(Path source, Path target, CopyOption... options):移动文件
- static Path copy(Path source, Path target, CopyOption... options):复制文件
- static long copy(Path source, OutputStream out):将文件复制到输出流,返回复制的字节数。
- static long copy(InputStream in, Path target, CopyOption... options):从输入流中复制到文件,返回复制的字节数。
5.获取文件信息
- static boolean exists(Path path, LinkOption... options):检查path对应的文件或目录是否存在
- static boolean notExists(Path path, LinkOption... options):检查path定位的文件或目录是否不存在
- static boolean isReadable(Path path):path对应的文件或目录是否可读
- static boolean isWritable(Path path):path对应的文件或目录是否可写
- static boolean isExecutable(Path path):path对应的文件或目录是否可执行
- static boolean isHidden(Path path):path对应的文件或目录是否隐藏
- static boolean isDirectory(Path path, LinkOption... options):path对应的文件或目录是否是目录
- static boolean isSameFile(Path path, Path path2):path与path2对应的文件或目录是否相同
- static boolean isRegularFile(Path path, LinkOption... options):
- static boolean isSymbolicLink(Path path) :
- static long size(Path path):
- static <A extends BasicFileAttributes> A readAttributes(Path path,Class<A> type,
LinkOption... options):读取类型为A的文件属性。
BasicFileAttributes attr = Files.readAttributes(path,BasicFileAttributes.class);
FileTime creationTime = attr.creationTime();
System.out.println("creationTime ="+creationTime);
//creationTime =2021-07-14T00:24:33.964697Z
FileTime lastAccessTime = attr.lastAccessTime();
System.out.println("lastAccessTime="+lastAccessTime);
//lastAccessTime=2021-07-15T02:57:44.823029Z
FileTime lastModifiedTime =attr.lastModifiedTime();
System.out.println("lastModifiedTime="+lastModifiedTime);
//lastModifiedTime=2021-07-15T01:56:11.429886Z
boolean isRegularFile = attr.isRegularFile();
System.out.println("isRegularFile="+isRegularFile);
//isRegularFile=false
boolean isDirectory = attr.isDirectory();
System.out.println("isDirectory="+isDirectory);
//isDirectory=true
boolean isSymbolicLink = attr.isSymbolicLink();
System.out.println("isSymbolicLink="+isSymbolicLink);
//isSymbolicLink=false
long size = attr.size();
System.out.println("size="+size);
//size=0
Object fileKey = attr.fileKey();
System.out.println("fileKey="+fileKey);
//fileKey=null
BasicFileAttributes
- FileTime creationTime();创建时间
- FileTime lastAccessTime();最后访问时间
- FileTime lastModifiedTime();最后修改时间
- boolean isRegularFile();
- boolean isDirectory();是否为目录
- boolean isSymbolicLink();
- long size();文件大小
6.访问目录中的项
- static Stream<Path> list(Path dir):返回一个可以读取目录中各个项的Stream<Path>对象。该方法不会进入子目录
- static Stream<Path> walk(Path start, FileVisitOption... options)
- static Stream<Path> walk(Path start,int maxDepth,FileVisitOption... options):该方法会会访问目录中的子目录,访问深度为maxDepth;若未指定,则为Integer.MAX_VALUE。
两种方法都有FileVisitOption选项,但只能提供一种选项:FOLLOW_LINKS,即跟踪符号链接。 - static Stream<Path> find(Path start,int maxDepth,BiPredicate<Path, > matcher,
FileVisitOption... options):该方法获取目录中的各个项,并访问子目录。并且通过matcher对所有项进行过滤。 - static DirectoryStream<Path> newDirectoryStream(Path dir):获取目录流。DirectoryStream不是Stream的子接口,而是专门用于目录遍历的接口,是Iterable的子接口。
try(DirectoryStream<Path> entries = Files.newDirectoryStream(path)){
for (Path path1 : entries){
Process entries;
}
}