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

很多朋友在看我的《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路径与参数文件名进行合并为一个新的文件路径。

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

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

觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。

java 文件 剪切_总结java中文件拷贝剪切的5种方式-JAVA IO基础总结第五篇相关推荐

  1. cmd 将文件夹下文件剪切到另外一个文件_总结java中文件拷贝剪切的5种方式-JAVA IO基础总结第五篇...

    本文是Java IO总结系列篇的第5篇,前篇的访问地址如下: 总结java中创建并写文件的5种方式-JAVA IO基础总结第一篇 总结java从文件中读取数据的6种方法-JAVA IO基础总结第二篇 ...

  2. html中获取modelandview中的json数据_从Bitmap中获取YUV数据的两种方式

    从Bitmap中我们能获取到的是RGB颜色分量,当需要获取YUV数据的时候,则需要先提取R,G,B分量的值,然后将RGB转化为YUV(根据具体的YUV的排列格式做相应的Y,U,V分量的排列) 所以这篇 ...

  3. Java实现剪切MP3格式的文件_总结java中文件拷贝剪切的5种方式-JAVA IO基础总结第五篇...

    本文是Java IO总结系列篇的第5篇,前篇的访问地址如下: 很多朋友在看我的<java IO总结系列>之前觉得创建文件.文件夹删除文件这些基础操作真的是太简单了.但看了我的文章之后,有小 ...

  4. java中怎么剪切文件_总结java中文件拷贝剪切的5种方式-JAVA IO基础总结第五篇

    本文是Java IO总结系列篇的第5篇,前篇的访问地址如下: 很多朋友在看我的<java IO总结系列>之前觉得创建文件.文件夹删除文件这些基础操作真的是太简单了.但看了我的文章之后,有小 ...

  5. java 循环依赖_浅谈Spring解决循环依赖的三种方式

    引言:循环依赖就是N个类中循环嵌套引用,如果在日常开发中我们用new 对象的方式发生这种循环依赖的话程序会在运行时一直循环调用,直至内存溢出报错.下面说一下Spring是如果解决循环依赖的. 第一种: ...

  6. 文件上传的三种方式-Java

    前言:负责,因为该项目他(jetty嵌入式开始SpringMvc)实现文件上传的必要性,并拥有java文件上传这一块还没有被曝光.并 Http 更多晦涩协议.因此,这种渐进的方式来学习和实践上载文件的 ...

  7. 总结java创建文件夹的4种方法及其优缺点-JAVA IO基础总结第三篇

    本文是Java IO总结系列篇的第3篇,前篇的访问地址如下: 总结java中创建并写文件的5种方式-JAVA IO基础总结第一篇 总结java从文件中读取数据的6种方法-JAVA IO基础总结第二篇 ...

  8. java 判断数组已经存满_详解Java中数组判断元素存在几种方式比较

    1. 通过将数组转换成List,然后使用List中的contains进行判断其是否存在 public static boolean useList(String[] arr,String contai ...

  9. 把一个数组的值存入二叉树中,然后利用前序、中序、后序3种方式进行遍历(完整代码以及运行结果)(Java)

    把一个数组的值存入二叉树中,然后利用前序.中序.后序3种方式进行遍历(完整代码以及运行结果) 在最近的面试过程中,听说有小伙伴被面试官要求创建二叉树,然后对该二叉树进行遍历,感觉这一直以来都是一个大家 ...

最新文章

  1. R函数之:apply(), lapply(), sapply(), tapply()
  2. 基于senparc实现的微信AccessToken接口全局统一获取
  3. 对称振子天线matlab程序,对称振子天线详解.ppt
  4. Boost:bimap双图operator bracket的测试程序
  5. VTK:Qt之BorderWidgetQt
  6. leetcode(3)---寻找最大字符串
  7. php 获得焦点,jquery中blur()失去焦点与focus() 获取焦点事件
  8. JAVA中Calendar与Date类型互转
  9. python123第四章第五题_Python123
  10. python数据类型:序列(字符串,元组,列表,字典)
  11. Android系统终端命令大全
  12. 概率论-数理统计部分思维导图
  13. python ddos_python 检查是否存在ddos攻击
  14. 求5的阶乘和1-5的阶乘和
  15. pdfminer将pdf转为csv
  16. C# 电子签章的实现
  17. 当前流行的J2EE WEB应用架构分析(一)
  18. 在线诺基亚短信图片生成器工具
  19. 阿里云 DataV 产品简介
  20. python PIL使用记录

热门文章

  1. 开源:推荐一个不错的离线IP地址定位库
  2. SpringBoot + RabbitMQ (保证消息100%投递成功并被消费)
  3. Spring Boot 2.x基础教程:事务管理入门
  4. 成为阿里 P7 真的难么?
  5. vb子程序未定义怎么改怎么办_提示子程序或函数未定义怎么修改。。。
  6. 动易html编辑器,文章内容一键排版功能——动易5.1版新特性
  7. linux sheet脚本去掉m,linux下的文本dos格式转unix格式,去除^M符号
  8. VS 动态库 导出C++类
  9. 点云处理库pyntcloud
  10. More than one file was found with OS independent path