其他分享
首页 > 其他分享> > 便携的文件操作-Files

便携的文件操作-Files

作者:互联网

便携的文件操作-Files

分隔符

Path

概述

Path表示的是一个目录名序列,其后还可以跟着一个文件名。路径中的第一个部分可以是根目录,例如/C:\,以根目录开始的路径是绝对路径,否则是相对路径。举个例子:

Path path = Paths.get("/home", "path", "demo");
path = /home/path/demo

Path path1 = Paths.get("home", "path", "demo");
path1 = home/path/demo
Path API
//组合路径。如果other是绝对路径,那么就返回other;否则,返回通过连接this和other获得的路径
Path resolve(String other);
Path resolve(Path other);

//组合路径。如果other是绝对路径,那么就返回other;否则,返回通过连接this的父路径和other获得的路径
Path resolveSibling(String other);
Path resolveSibling(Path other);
//返回相对于other的相对路径
Path relativize(other);
//移除.和..等冗余的路径元素
Path normalize();
//返回绝对路径
Path toAbsolutePath();
//返回父路径,如果没有则返回null
Path getParent();
//返回路径的最后一个路径部件
Path getFileName();
//返回文件的跟路径
Path getRoot();
//从该路径中创建以个File对象
Path toFile();

Files

概述

Files工具类可以使得普通文件操作变得快捷。例如:

//读取文件所有内容
byte[] bytes = Files.readAllBytes(path);
//按行读入
List<String> lines = Files.readAllLines(path);
List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
//写出文件
Path write = Files.write(path, bytes);
Path write = Files.write(path, lines);

这些简便的方法适用于处理中等长度的文件,如果要处理的文件长度比较大,或者是二进制文件,那么还是应该使用输入/输出流或读入器/写出器:

InputStream in = Files.newInputStream(path);
OutputStream out = Files.newOutputStream(path);
BufferedReader in = Files.newBufferedReader(path);
BufferedWriter out = Files.newBufferedWriter(path);
创建文件和目录
//创建目录
Path directory = Files.createDirectory(path);
//递归创建目录
Path directory1 = Files.createDirectories(other);
//创建文件
Path file = Files.createFile(filePath);

//创建临时文件|目录
Path tempFile = Files.createTempFile(path, "demoTemp", ".text");
//新建的文件为:path/demoTemp1755677485909684463.text
Path tempFile1 = Files.createTempFile("demoTemp", ".text");
//新建文件为:/var/.../demoTemp7347118361156223079.text
Path tempFile2 = Files.createTempFile(null, ".text");
//新建文件为:/var/.../6300881984327212300.text
Path tempDirectory = Files.createTempDirectory(path, "demoTemp");
//新建的目录为:path/demoTemp201107870961044007
Path tempDirectory1 = Files.createTempDirectory("demoTemp");
//新建的目录为:/var/.../demoTemp4584110971885510312
复制、移动和删除文件
/**
 * fromPath:/path/from/demo.text
 * toPath:/path/to/demo.text
 */
//复制文件
Path copy = Files.copy(fromPath, toPath);
//将输入流存储到硬盘上
long copy2 = Files.copy(inputStream, toPath);
//将Path复制到输出流
long copy1 = Files.copy(fromPath, outputStream);
//移动文件
Path move = Files.move(fromPath, toPath);
//删除文件,如果文件不存在会抛异常
Files.delete(toPath);
//删除文件或移除空目录
boolean exists = Files.deleteIfExists(toPath);

复制文件时如果目标路径已经存在,那么复制或移动将失败。如果想要覆盖已有的目标路径,可以使用REPLACE_EXISTING选项。如果要复制文件所有属性,可以使用ATTRIBUTES选项。可以使用ATOMIC_MOVE选项来保证移动的原子性

Path move = Files.move(fromPath, toPath, StandardCopyOption.ATOMIC_MOVE);
访问目录中的项

静态的Files.list方法会返回一个可以读取目录中各个项的Stream对象。目录是被惰性读取的,这使得处理具有大量项目的目录可以更高效。

使用Files.walk方法可以递归方式获取所有子目录。使用walk方法删除目录树比较困难,因为需要在删除父目录之前先删除子目录

因为读取目录涉及需要关闭系统资源,所以应该使用try块:

try(Stream<Path> entries = Files.list(path)){
	...
}

示例:将一个目录复制到另外一个目录

Path target = Paths.get("");
Files.walk(path).forEach(p -> {
    try {
        Path q = target.resolve(p);
        if (Files.isDirectory(p)) {
            Files.createDirectory(q);
        } else {
            Files.copy(p, q);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
});
使用目录流

使用目录流删除目录树

Path root = Paths.get("");
Files.walkFileTree(root, new SimpleFileVisitor<Path>() {
    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
        Files.delete(file);
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult postVisitDirectory(Path dir, IOException e) throws IOException {
        if (e != null) {
            throw e;
        }
        Files.delete(dir);
        return FileVisitResult.CONTINUE;
    }
});

附录

Files API
//创建文件或目录
static Path createDirectory(Path dir, FileAttribute<?>... attrs)
static Path createDirectories(Path dir, FileAttribute<?>... attrs)
static Path createFile(Path path, FileAttribute<?>... attrs)
//在合适临时文件的位置或给定父目录创建临时文件或目录,返回创建文件或目录的路径
static Path createTempFile(Path dir, String prefix, String suffix, FileAttribute<?>... attrs)
static Path createTempFile(String prefix, String suffix, FileAttribute<?>... attrs)
static Path createTempDirectory(Path dir, String prefix, FileAttribute<?>... attrs)
static Path createTempDirectory(String prefix, FileAttribute<?>... attrs)
//将from复制或移动到制定位置,并返回to
static Path copy(Path source, Path target, CopyOption... options);
static Path move(Path source, Path target, CopyOption... options);
//从输入流复制到文件或从从文件复制到输出流
static long copy(Path source, OutputStream out);
static long copy(InputStream in, Path target, CopyOption... options);
//删除文件或空目录
static void delete(Path path);
static boolean deleteIfExists(Path path);
//第一个当文件或目录不存在时会抛异常,而第二个会直接返回false

//获取文件信息
static boolean exists(Path path, LinkOption... options);
static boolean isHidden(Path path, LinkOption... options);
static boolean isReadable(Path path);
static boolean isWritable(Path path);
static boolean isExecutable(Path path);
static boolean isRegularFile(Path path, LinkOption... options);
static boolean isDirectory(Path path, LinkOption... options);
static boolean isSymbolicLink(Path path);
//获取文件的字节数
static long size(Path path);
//读取类型为A的文件属性
static <A extends BasicFileAttributes> A readAttributes(Path path,Class<A> type,LinkOption... options);

//获取目录中的文件或目录
static DirectoryStream<Path> newDirectoryStream(Path dir);
static DirectoryStream<Path> newDirectoryStream(Path dir, String glob);
//遍历所有子孙
static Path walkFileTree(Path start, FileVisitor<? super Path> visitor)
用于文件操作的标准选项
Glob模式ß
模式 描述 示例
* 匹配路径组成部分中0个或多个字符(不含子目录) *.java
** 匹配跨目录边界的0个或多个字符(含子目录) **.java
匹配一个字符 demo?.java
[…] 匹配一个字符集([0-9]、[A-F]、[!0-9]) demo[0-9].java
{…} 匹配由逗号隔开的多个可选项之一 *.{java, class}
\ 转译上述任意模式中的字符以及\字符

标签:Files,文件,便携,...,static,Path,path
来源: https://blog.csdn.net/weixin_43165534/article/details/104654554