java file.renameTo返回false的原因及解决方案

 更新时间:2021年07月07日 11:00:37   作者:zhangSir134  
这篇文章主要介绍了java file.renameTo返回false的原因及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

java file.renameTo返回false原因

需要对文件夹下的文件重命名,发现返回false了,先用main方法测试,发现没问题,如下

public static void main(String[] args) throws IOException {
        File file1 = new File("D:\\aabb.xml");
        File file2 = new File("D:\\ccdd.xml");
        boolean b = file1.renameTo(file2);
        System.out.println(b); // true
    }

最后发现,是一个文件是用文件流写的,流没用close,导致文件重命名失败了,模拟如下

public static void main(String[] args) throws IOException {
        File file1 = new File("D:\\aabb.xml");
        FileWriter out = new FileWriter(file1);
        File file2 = new File("D:\\ccdd.xml");
        boolean b = file1.renameTo(file2);
        System.out.println(b);// false
    }

最终也是很好解决

找个合适的地方close就好了

public static void main(String[] args) throws IOException {
        File file1 = new File("D:\\aabb.xml");
        FileWriter out = new FileWriter(file1);
        out.close();
        File file2 = new File("D:\\ccdd.xml");
        boolean b = file1.renameTo(file2);
        System.out.println(b);//true
    }

java File.renameTo方法,需要注意的坑

最近在接手老项目的时候,遇到File.renameTo(File file)方法,不清楚特性,于是研究了下源码,发现底层调用的是Native方法实现的。

本身带着对其用法的困惑,写了一个测试用例来揭开它的神秘面纱,发现两个在使用时值得注意的点。

测试用例代码如下:

import java.io.File;
import java.io.IOException; 
public class TestRenameTo {
  public static void main(String[] args) {
    File file = new File("f:\\1.txt");
    if (!file.isFile()) {
      try {
        file.createNewFile();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  //调用renameTo()前
    System.out.println(file.exists());
    file.renameTo(new File("f:\\2.txt"));
  //调用renameTo()后
    System.out.println(file.exists());
  }
}

第一次运行程序,目录下1.txt和2.txt均不存在

得到结果如下:

可以看出调用renameTo前后,1.txt先是存在,然后消失,最后文件夹中生成了2.txt。

为了方便比较第二次结果,往2.txt写入些内容,“hello world!”(原谅我的中二 ^-^)

第二次运行程序,目录下已存在2.txt,得到结果如下:

2.txt中的内容并没有被替换掉,证明此次重命名没有成功。

总结:

  • 如果被重命名的文件已存在,那么renameTo()不会成功
  • renameTo()成功后,原文件会被删除

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java的函数方法详解(含汉诺塔问题)

    Java的函数方法详解(含汉诺塔问题)

    汉诺塔问题是一个经典的递归问题,下面这篇文章主要给大家介绍了关于Java函数方法(含汉诺塔问题)的相关资料,文中通过图文以及代码示例介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • java 迭代器模式实例详解

    java 迭代器模式实例详解

    这篇文章主要介绍了java 迭代器模式实例详解的相关资料,需要的朋友可以参考下
    2017-05-05
  • Spring AbstractRoutingDatasource 动态数据源的实例讲解

    Spring AbstractRoutingDatasource 动态数据源的实例讲解

    本文介绍如何使用 Spring AbstractRoutingDatasource 基于上下文动态切换数据源,因此我们会让查找数据源逻辑独立于数据访问之外
    2021-07-07
  • 详解Maven Docker镜像使用技巧

    详解Maven Docker镜像使用技巧

    这篇文章主要介绍了详解Maven Docker镜像使用技巧,Maven是目前最流行的Java项目管理工具之一,提供了强大的包依赖管理和应用构建功能。本文以Maven为例介绍了Docker在应用构建中的一些常见技巧。
    2018-06-06
  • Java文件读取写入后 md5值不变的实现方法

    Java文件读取写入后 md5值不变的实现方法

    下面小编就为大家分享一篇Java文件读取写入后 md5值不变的实现方法,具有很好的参考价值,希望对大家有所帮助
    2017-11-11
  • Java压缩之LZW算法字典压缩与解压讲解

    Java压缩之LZW算法字典压缩与解压讲解

    今天小编就为大家分享一篇关于Java压缩之LZW算法字典压缩与解压讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • Spring boot按日切分spring boot的nohup.out日志文件的方法

    Spring boot按日切分spring boot的nohup.out日志文件的方法

    过大的日志文件维护起来存在诸多问题,所以最好是能够按日或按大小切分日志文件,下面小编给大家带来了Spring boot按日切分spring boot的nohup.out日志文件的方法,一起看看吧
    2018-08-08
  • 消息队列 RabbitMQ 与 Spring 整合使用的实例代码

    消息队列 RabbitMQ 与 Spring 整合使用的实例代码

    本篇文章主要介绍了消息队列 RabbitMQ 与 Spring 整合使用的实例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Java8处理List的双层循环问题

    Java8处理List的双层循环问题

    这篇文章主要介绍了Java8处理List的双层循环问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Java 详解包装类Integer与int有哪些共通和不同

    Java 详解包装类Integer与int有哪些共通和不同

    这篇文章主要介绍的是 Java中int和Integer的区别,Java 是一种强数据类型的语言,因此所有的属性必须有一个数据类型,下面文章基于Java详细int和Integer有何区别,需要的朋友可以参考一下
    2022-04-04

最新评论