本文是Java IO总结系列篇的第5篇,前篇的拜访地址如下:

  • 总结java中创立并写文件的5种形式-JAVA IO根底总结第一篇
  • 总结java从文件中读取数据的6种办法-JAVA IO根底总结第二篇
  • 总结java创立文件夹的4种办法及其优缺点-JAVA IO根底总结第三篇
  • 总结java中删除文件或文件夹的7种办法-JAVA IO根底总结第四篇

很多敌人在看我的《java IO总结系列》之前感觉创立文件、文件夹删除文件这些根底操作真的是太简略了。但看了我的文章之后,有小伙伴找到我说:“没想到这么根底的常识外面还有这么多的门门道道,用起来很容易,真的用好也不容易”。哪一个办法用起来简略,哪一个办法在异样解决方面更加强壮,不看我的总结你可能还真的不晓得。

有趣味的理解更多的小伙伴能够关注我,我会继续的写这一系列的文章。如果您感觉我的文章对您有帮忙,请帮忙点个赞,您的反对是我不竭的创作能源!

那咱们上面就来为大家介绍本篇的内容:文件拷贝(重命名)与剪切的5种办法。首先咱们来了解以下上面的几个概念:

  • 文件拷贝:将文件从一个文件夹复制到另一个文件夹
  • 文件剪切:将文件从以后文件夹,挪动到另一个文件夹
  • 文件重命名:将文件在以后文件夹上面改名(也能够了解为将文件剪切为以后文件夹上面的另一个文件)

一、文件拷贝

传统IO中的文件copy的办法,应用输入输出流,实际上就是从新创立并写入一个文件。如果指标文件曾经存在,就笼罩掉它,从新创立一个文件并写入数据。这种形式不够敌对,笼罩掉原有文件没有给出任何提醒,有可能导致原有数据的失落

@Testvoid testCopyFile1() throws IOException {  File fromFile = new File("D:\\data\\test\\newFile.txt");  File toFile = new File("D:\\data\\test2\\copyedFile.txt");  try(InputStream inStream = new FileInputStream(fromFile);      OutputStream outStream = new FileOutputStream(toFile);) {    byte[] buffer = new byte[1024];    int length;    while ((length = inStream.read(buffer)) > 0) {      outStream.write(buffer, 0, length);      outStream.flush();    }  }}

Java NIO中文件copy的办法,应用形式简略。当指标文件曾经存在的时候会抛出FileAlreadyExistsException ,当源文件不存在的时候抛出NoSuchFileException,针对不同的异样场景给出不同的Exception,更有利于咱们写出健壮性更好的程序。

@Testvoid testCopyFile2() throws IOException {  Path fromFile = Paths.get("D:\\data\\test\\newFile.txt");  Path toFile = Paths.get("D:\\data\\test2\\copyedFile.txt");  Files.copy(fromFile, toFile);}

如果在指标文件曾经存在的状况下,你不想抛出FileAlreadyExistsException ,而是去笼罩它,也能够灵便的抉择应用上面的选项

  • StandardCopyOption.REPLACE_EXISTING 来疏忽文件曾经存在的异样,如果存在就去笼罩掉它
//如果指标文件存在就替换它Files.copy(fromFile, toFile, StandardCopyOption.REPLACE_EXISTING);
  • StandardCopyOption.COPY_ATTRIBUTES copy文件的属性,最近批改工夫,最近拜访工夫等信息,不仅copy文件的内容,连文件附带的属性一并复制
CopyOption[] options = { StandardCopyOption.REPLACE_EXISTING,      StandardCopyOption.COPY_ATTRIBUTES //copy文件的属性,最近批改工夫,最近拜访工夫等};Files.copy(fromFile, toFile, options);

二、文件重命名

NIO中能够应用Files.move办法在同一个文件夹内挪动文件,并更换名字。当指标文件曾经存在的时候,同样会有FileAlreadyExistsException,也同样能够应用StandardCopyOption去解决该异样。

@Testvoid testRenameFile() throws IOException {  Path source = Paths.get("D:\\data\\test\\newFile.txt");  Path target = Paths.get("D:\\data\\test\\renameFile.txt");  //REPLACE_EXISTING文件存在就替换它  Files.move(source, target,StandardCopyOption.REPLACE_EXISTING);}

下文中的实现办法和下面代码的成果是一样的,resolveSibling作用是将source文件的父门路与参数文件名合并为一个新的文件门路。

resolve系列函数在windows和linux等各种零碎解决门路分隔符号、门路与文件名合并等,比本人手写代码去解决不同操作系统的门路分隔符号、门路与文件名合并有更好的操作系统兼容性。
@Testvoid testRenameFile2() throws IOException {  Path source = Paths.get("D:\\data\\test\\newFile.txt");  //这种写法就更加简略,兼容性更好  Files.move(source, source.resolveSibling("renameFile.txt"));}

传统IO中应用File类的renameTo办法重命名,失败了就返回false,没有任何异样抛出。你不会晓得你失败的起因是什么,是因为源文件不存在导致失败?还是因为指标文件曾经存在导致失败?所以这种办法笔者不倡议应用。

@Testvoid testRenameFile3() throws IOException {  File source = new File("D:\\data\\test\\newFile.txt");  boolean succeeded = source.renameTo(new File("D:\\data\\test\\renameFile.txt"));  System.out.println(succeeded);  //失败了false,没有异样}

三、文件剪切

文件剪切实际上依然是Files.move,如果move的指标文件夹不存在或源文件不存在,都会抛出NoSuchFileException

@Testvoid testMoveFile() throws IOException {  Path fromFile = Paths.get("D:\\data\\test\\newFile.txt"); //文件  Path anotherDir = Paths.get("D:\\data\\test\\anotherDir"); //指标文件夹  Files.createDirectories(anotherDir);  Files.move(fromFile, anotherDir.resolve(fromFile.getFileName()),          StandardCopyOption.REPLACE_EXISTING);}

resolve函数是解析anotherDir门路与参数文件名进行合并为一个新的文件门路。

欢送关注我的博客,外面有很多精品合集

  • 本文转载注明出处(必须带连贯,不能只转文字):字母哥博客。

感觉对您有帮忙的话,帮我点赞、分享!您的反对是我不竭的创作能源! 。另外,笔者最近一段时间输入了如下的精品内容,期待您的关注。

  • 《手摸手教你学Spring Boot2.0》
  • 《Spring Security-JWT-OAuth2一本通》
  • 《实战前后端拆散RBAC权限管理系统》
  • 《实战SpringCloud微服务从青铜到王者》
  • 《VUE深入浅出系列》