本文是 Java IO 总结系列篇的第 5 篇,前篇的拜访地址如下:
- 总结 java 中创立并写文件的 5 种形式 -JAVA IO 根底总结第一篇
- 总结 java 从文件中读取数据的 6 种办法 -JAVA IO 根底总结第二篇
- 总结 java 创立文件夹的 4 种办法及其优缺点 -JAVA IO 根底总结第三篇
- 总结 java 中删除文件或文件夹的 7 种办法 -JAVA IO 根底总结第四篇
很多敌人在看我的《java IO 总结系列》之前感觉创立文件、文件夹删除文件这些根底操作真的是太简略了。但看了我的文章之后,有小伙伴找到我说:“没想到这么根底的常识外面还有这么多的门门道道,用起来很容易,真的用好也不容易”。哪一个办法用起来简略,哪一个办法在异样解决方面更加强壮,不看我的总结你可能还真的不晓得。
有趣味的理解更多的小伙伴能够关注我,我会继续的写这一系列的文章。如果您感觉我的文章对您有帮忙,请帮忙点个赞,您的反对是我不竭的创作能源!
那咱们上面就来为大家介绍本篇的内容: 文件拷贝(重命名)与剪切的 5 种办法 。首先咱们来了解以下上面的几个概念:
- 文件拷贝:将文件从一个文件夹复制到另一个文件夹
- 文件剪切:将文件从以后文件夹,挪动到另一个文件夹
- 文件重命名:将文件在以后文件夹上面改名(也能够了解为将文件剪切为以后文件夹上面的另一个文件)
一、文件拷贝
传统 IO 中的文件 copy 的办法,应用输入输出流,实际上就是从新创立并写入一个文件。如果指标文件曾经存在,就笼罩掉它,从新创立一个文件并写入数据。这种形式不够敌对, 笼罩掉原有文件没有给出任何提醒,有可能导致原有数据的失落 。
@Test
void 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,更有利于咱们写出健壮性更好的程序。
@Test
void 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 去解决该异样。
@Test
void 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 等各种零碎解决门路分隔符号、门路与文件名合并等,比本人手写代码去解决不同操作系统的门路分隔符号、门路与文件名合并有更好的操作系统兼容性。
@Test
void testRenameFile2() throws IOException {Path source = Paths.get("D:\\data\\test\\newFile.txt");
// 这种写法就更加简略,兼容性更好
Files.move(source, source.resolveSibling("renameFile.txt"));
}
传统 IO 中应用 File 类的 renameTo 办法重命名,失败了就返回 false,没有任何异样抛出。你不会晓得你失败的起因是什么,是因为源文件不存在导致失败?还是因为指标文件曾经存在导致失败?所以这种办法笔者不倡议应用。
@Test
void 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
@Test
void 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 深入浅出系列》