java nio的常用方法_Java NIO Files 的常用方法

Java NIO Files类(java.nio.file.Files)提供了几种操作文件的方法,这里介绍一些最常用的方法。

java.nio.file.Files类可与java.nio.file.Path实例一起使用,因此在使用Files类之前,需要了解Path类。

1.Files.exists()

Files.exists()方法检查文件系统中是否存在给定的Path。

如果你打算创建一个新目录,则首先要创建相应的Path实例,然后再创建目录。

由于Path实例可能会指向文件系统中不存在的路径,因此可以使用Files.exists()方法确定它们是否存在。

一个Java Files.exists()示例:Path path = Paths.get("data/logging.properties");

boolean pathExists = Files.exists(path, new LinkOption[]{ LinkOption.NOFOLLOW_LINKS});

创建一个Path实例,该实例指向我们要检查是否存在的路径。

2.Files.createDirectory()

Files.createDirectory()方法从Path实例创建一个新目录。示例: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();

}

第一行创建Path实例,该实例代表要创建的目录。在try-catch块内,使用路径作为参数调用Files.createDirectory()方法。如果创建目录成功,则将返回一个Path实例,该实例指向新创建的路径。

如果目录已经存在,则将抛出java.nio.file.FileAlreadyExistsException。如果还有其它错误,可能会引发IOException。例如,如果所需的新目录的父目录不存在,则可能引发IOException。

3.Files.copy()

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实例。然后,该示例调用Files.copy(),并将两个Path实例作为参数传递。这将导致源路径引用的文件被复制到目标路径引用的文件。

如果目标文件已经存在,则抛出java.nio.file.FileAlreadyExistsException。如果发生其他错误,将抛出IOException。例如,如果复制文件的目录不存在,则将抛出IOException。

4.覆盖现有文件

可以强制Files.copy()覆盖现有文件。这是一个示例,显示了如何使用Files.copy()覆盖现有文件: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.copy()方法的第三个参数。如果目标文件已经存在,则此参数指示copy()方法覆盖现有文件。

5.Files.move()

Java NIO Files类还包含一个用于将文件从一个路径移动到另一路径的函数。移动文件与重命名相同,不同之处在于移动文件既可以将文件移动到另一个目录,又可以在同一操作中更改其名称。java.io.File类也可以使用自己的namedTo()方法来做到这一点。

示例: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.move()方法。这导致文件被移动。

注意传递给Files.move()的第三个参数。此参数告诉Files.move()方法覆盖目标路径上的任何现有文件。参数是可选的。

如果移动文件失败,则Files.move()方法可能会引发IOException。例如,如果目标路径上已经存在一个文件,而你省略了StandardCopyOption.REPLACE_EXISTING选项,或者要移动的文件不存在,等等。

6.Files.delete()

Files.delete()方法可以删除文件或目录。示例:Path path = Paths.get("data/subdir/logging-moved.properties");

try {

Files.delete(path);

} catch (IOException e) {

//deleting file failed

e.printStackTrace();

}

首先,创建指向要删除文件的路径。其次,调用Files.delete()方法。如果Files.delete()由于某种原因未能删除文件(例如,文件或目录不存在),则会引发IOException。

7.Files.walkFileTree()

Files.walkFileTree()方法包含用于递归遍历目录树的功能。 walkFileTree()方法将Path实例和FileVisitor作为参数,Path实例指向要遍历的目录。在遍历期间将调用FileVisitor。

FileVisitor接口:public interface FileVisitor {

public FileVisitResult preVisitDirectory(

Path dir, BasicFileAttributes attrs) throws IOException;

public FileVisitResult visitFile(

Path file, BasicFileAttributes attrs) throws IOException;

public FileVisitResult visitFileFailed(

Path file, IOException exc) throws IOException;

public FileVisitResult postVisitDirectory(

Path dir, IOException exc) throws IOException {

}

你必须自己实现FileVisitor接口,并将实现的实例传递给walkFileTree()方法。在遍历目录期间,FileVisitor实现的每个方法将在不同时期调用,如果不需要使用所有这些方法,则可以使用扩展类SimpleFileVisitor,该类包含FileVisitor接口中所有方法的默认实现。

walkFileTree()示例:Files.walkFileTree(path, new FileVisitor() {

@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;

}

});

在遍历期间,FileVisitor实现中的每个方法在不同的时期被调用:

在访问任何目录之前,都会调用preVisitDirectory()方法。访问目录后立即调用postVisitDirectory()方法。

文件遍历期间访问的每个文件都会调用visitFile()方法。它不用于目录-仅用于文件。万一访问文件失败,则会调用visitFileFailed()方法。例如,如果没有权限,或者发生其他错误。

四个方法中的每一个都返回FileVisitResult枚举实例。 FileVisitResult枚举包含以下四个选项:

CONTINUE

TERMINATE

SKIP_SIBLINGS

SKIP_SUBTREE

通过返回这些值之一,被调用的方法可以决定如何继续文件遍历。

CONTINUE表示文件遍历应继续正常进行。

TERMINATE表示文件遍历应立即终止。

SKIP_SIBLINGS表示应继续进行文件遍历,但没有访问此文件或目录的任何同级文件。

SKIP_SUBTREE表示应继续执行文件遍历,但没有访问此目录中的条目。仅当从preVisitDirectory()返回时,此值才具有功能。如果从任何其它方法返回,它将被解释为CONTINUE。

8.搜索文件

这是walkFileTree(),使用SimpleFileVisitor来查找名为README.txt的文件:Path rootPath = Paths.get("data");

String fileToFind = File.separator + "README.txt";

try {

Files.walkFileTree(rootPath, new SimpleFileVisitor() {

@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();

}

9.递归删除目录

Files.walkFileTree()也可以用于删除其中包含的所有文件和子目录。如果目录为空,则Files.delete()方法将仅删除该目录。

通过遍历所有目录并删除每个目录中的所有文件(在visitFile()内部),然后删除目录本身(在postVisitDirectory()内部),可以删除包含所有子目录和文件。

示例:Path rootPath = Paths.get("data/to-delete");

try {

Files.walkFileTree(rootPath, new SimpleFileVisitor() {

@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();

}

java.nio.file.Files类还包含许多其它有用的方法,例如用于创建符号链接,确定文件大小,设置文件权限等的功能。有关更多信息,请查阅JavaDoc中的java.nio.file.Files类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值