本文是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中文件拷贝剪切的5种方式-JAVA IO基础总结第五篇的更多相关文章

  1. Java中 实现多线程成的三种方式(继承,实现,匿名内部类)

    ---------------------------------------------------------------------------------------------------- ...

  2. Java中创建实例化对象的几种方式

    Java中创建实例化对象有哪些方式? ①最常见的创建对象方法,使用new语句创建一个对象.②通过工厂方法返回对象,例:String s =String.valueOf().(工厂方法涉及到框架)③动用 ...

  3. java 中创建线程有哪几种方式?

    Java中创建线程主要有三种方式: 一.继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行 ...

  4. java中线程池创建的几种方式

    java中创建线程池的方式一般有两种: 通过Executors工厂方法创建 通过new ThreadPoolExecutor(int corePoolSize, int maximumPoolSize ...

  5. Java中 单例(Singleton)的两种方式

    第一种(饿汉式单例模式):在声明变量时实例化 public class Singleton { //静态初始化自动实例化 private static Singleton instance = new ...

  6. Java中从控制台输入的三种方式

    我们最熟悉的从控制台读取一个字符或者一个字符串都知道用Scanner,那么除了Scanner还有没有其他的呢,答案是有的,我们来看看. System.in.read() System.in.read( ...

  7. java向文件写数据的3种方式

    下边列举出了三种向文件中写入数据的方式,当然还有其他方式,帮助自己理解文件写入类的继承关系.类的关系: file->fileoutputstream->outputstreamWriter ...

  8. Servlet中文件上传的几种方式

    上传文件,因为上传的都是二进制数据,所以在Servlet中就不能直接用request.getParameter();方法进行数据的获取,需要借助第三方jar包对上传的二进制文件进行解析.常用的方式如下 ...

  9. Java 中初始化 List 集合的 6 种方式!

    List 是 Java 开发中经常会使用的集合,你们知道有哪些方式可以初始化一个 List 吗?这其中不缺乏一些坑,今天栈长我给大家一一普及一下. 1.常规方式 List<String> ...

随机推荐

  1. 笨办法学python3练习代码13-14:argv参数变量的学习

    ex13.py  argv参数的学习 #argv:参数变量(argument variable),这是一个标准的编程术语,在其他语言中也可可以看到.argument可译为: 参数 #如果参数是用户在执 ...

  2. 【HNOI2009】最小圈 题解(SPFA判负环+二分答案)

    前言:模拟赛考试题,不会做,写了个爆搜滚蛋仍然保龄. --------------------- 题目链接 题目大意:给定一张有向图,求一个环,使得这个环的长度与这个环的大小(所含结点个数)的比值最小 ...

  3. Python高手是怎样炼成的!

    很多想从事python行业的朋友都会问到,零基础如何自学成为Python高手?根据小北多年教育的经验,我总结了几个小建议,想看干货的请看下文! 如何克服入门难问题? 其实小北觉得,最好的方法就是和一群 ...

  4. 分享一个内网穿透工具frp

    首先简单介绍一下内网穿透: 内网穿透:通过公网,访问局域网里的IP地址与端口,这需要将局域网里的电脑端口映射到公网的端口上:这就需要用到反向代理,即在公网服务器上必须运行一个服务程序,然后在局域网中需 ...

  5. Python分析「我们为什么这么穷」

  6. socket传输图片用shutdownoutput()之后无法继续传输数据

    socket传输图片用shutdownoutput()之后无法继续传输数据前言java的socket是一个全双工套接字,任何的输入流或输出流的close()都会造成Socket关闭.使用java服务器 ...

  7. IPSec传输模式下的ESP报文的装包和拆包过程

    IPSec协议定义 IPsec将IP数据包的内容在装包过程在网络层先加密再传输,即便中途被截获,由于缺乏解密数据包所必要的密钥,攻击者也无法获取里面的内容. IPsec 对数据进行加密的方式 加密模式 ...

  8. Caused by: org.postgresql.util.PSQLException: 错误: 语法错误 在 "desc" 、语法错误 在 "from" 附近

    此错误一般是由于postgres的数据库表字段名定义与关键字重名所致: 如下,创建的数据库表包含名称为“desc”的字段与倒叙查询的desc关键字冲突会导致Caused by: org.postgre ...

  9. HTML实例-02-京东顶部导航条

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  10. Jdk1.7下的HashMap源码分析

    本文主要讨论jdk1.7下hashMap的源码实现,其中主要是在扩容时容易出现死循环的问题,以及put元素的整个过程. 1.数组结构 数组+链表 示例图如下: 常量属性 /** * The defau ...