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()成功后,原文件会被删除

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

(0)

相关推荐

  • Java中File类中常用方法详解

    java.io包下的File类用于描述和创建一个文件或文件夹对象,只能对文件或文件夹做一些简单操作,不能修改文件的内容,功能比较有限.下面是对于File类中常用方法的程序演示. [1] 演示程序一 package pack01; import java.io.*; import java.sql.Date; public class FileTest { public static void main(String[] args) { File file1 = new File("d:/TEST

  • java中File类的构造函数及其方法

    1.IO流(Input Output) IO流技术主要的作用是解决设备与设备之间的数据传输问题,比如:硬盘的数据--读取到-->内存中 内存的数据--读取到-->硬盘中 键盘上的数据--读取到-->内存中 2.IO流技术的运用场景 导出报表.上传大头照.下载.解析xml文件.....等等 (数据保存到硬盘,该数据可以做到永久性保存.数据一般以文件的形式保存到硬盘上.sun使用一个File类来描述文件或者文件夹) 3.File类的构造函数(方法) File(String pathname)

  • Java File类的常用方法总结

    Java File类的功能非常强大,利用Java基本上可以对文件进行所有的操作.本文将对Java File文件操作类进行详细地分析,并将File类中的常用方法进行简单介绍,有需要的Java开发者可以看一下. 构造函数 复制代码 代码如下: public class FileDemo {      public static void main(String[] args){          //构造函数File(String pathname)          File f1 =new Fi

  • java开发之File类详细使用方法介绍

    File类简介 在 Java 中,File 类是 java.io 包中唯一代表磁盘文件本身的对象.File 类定义了一些与平台无关的方法来操作文件,File类主要用来获取或处理与磁盘文件相关的信息,像文件名. 文件路径.访问权限和修改日期等,还可以浏览子目录层次结构. File 类表示处理文件和文件系统的相关信息.也就是说,File 类不具有从文件读取信息和向文件写入信息的功能,它仅描述文件本身的属性. File类的相关方法 1.构造方法 File(String pathname) 通过将给定路

  • 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.rename

  • easyui form validate总是返回false的原因及解决方法

    最近做表单验证用了easyui form组件.又一次发现在测试表单都填写正确了但是调试表单的代码监测到调用form的"validate"方法总是返回false 最后查了一下原因在html中写的是easyui-validatebox但是在script中却又声明了$('#field1').combobox(); <form id="form1"> <input type="text" id="field1" cl

  • java process.waitfor返回1的原因及解决

    目录 java process.waitfor返回1 大致的原因如下 process.waitFor()的返回值含义 以下是Linux中返回值对照表 java process.waitfor返回1 java的process,在执行命令时,出现waitfor返回1错误.根据java文档,是operation not permited.但绝大多数情况下,这是瞎扯. 真正原因是,你执行的命令(dos或linux下的命令),java的process执行时候,出错了.而错误本身是在这个命令的字符串上. 大

  • Java并发统计变量值偏差原因及解决方案

    1 问题描述 在一个项目中,需要对发送的请求结果进行统计,开发同事定义了两个全局共享变量CommonUtil.ReqFailNum和ReqNum,分别记录请求失败数和发送的请求数.并在每次发送请求之前都假定该请求会处理失败,先对其累加,直到成功收到200的返回码后,重新修正失败数量. 最后当应用处理请求处于较频繁的阶段时,出现了ReqFailNum最后减为负数的情况,一次正常请求完成时, CommonUtil.ReqFailNum ++;和CommonUtil.ReqFailNum --应该是成

  • java.io.File的renameTo方法移动文件失败的解决方案

    今天线上发现一个问题,发现一个定时移动文件的业务没有正常执行,结合日志和代码发现,移动文件是使用File类的renameTo方法,但是方法返回的都是false,表示文件移动失败. 出现这个问题我第一反应是不是文件权限的问题,但是和运维研究后发现的确不是权限导致的.既然不是权限的问题,那就看看renameTo的实现吧,查看源码发现该方法最终是通过一个本地方法实现的,看不到咋写的. 网上查了一下renameTo这个方法,发现这个方法确实存在一些问题,就是在不同的文件系统中移动是不会成功的.因为测试环

  • java删除文件时总是返回false,删不掉的解决方案

    目录 java删除文件时总是返回false,删不掉 我的解决 java文件删除不了的坑,特别是压缩文件 下面列举一些情况 java.util.zip.ZipFile.close()方法关闭ZIP文件 java删除文件时总是返回false,删不掉 今天写了个简单的文件删除的程序:代码如下: public static boolean deleteFiles(File[] files){ boolean flag = false; for(File file:files){ // 路径为文件且不为空

  • Java File类的详解及简单实例

    Java File类的详解及简单实例 1. File():构造函数,一般是依据文件所在的指定位置来创建文件对象.  CanWrite():返回文件是否可写. CanRead():返回文件是否可读. CompareTo(File pathname):检查指定文件路径间的顺序. Delet():从文件系统内删除该文件. DeleteOnExit():程序顺利结束时从系统中删除文件. Equals(Object obj):检查特定对象的路径名是否相等. Exists():判断文件夹是否存在. GetA

  • Java提示缺少返回语句的解决办法

    Java提示缺少返回值语句怎么办?这里我们给大家提供具体的解决方法. 首先,以下面的程序为例,会看到在控制台有:错误:缺少返回语句的提示. 找到类中定义的方法test中发现,明明已经定义了return,软件依然会提示错误. 将return定义到for循环之外,就会发现,程序不再报错. 原因是因为数组不仅仅可以存放具体的变量值,而且可以不赋给数组任何值. 在数组内容为空的情况,程序是没有报错的,所以需要将return返回值定义到   for 循环之外即可. 关于Java中return缺少返回语句的

  • Java xml数据格式返回实现操作

    前言:对于服务器后端开发,接口返回的数据格式一般要求都是json,但是也有使用xml格式 RequestBody注解 对于SpringMVC,很多人会认为接口方法使用@Controller搭配@ResponseBody和@RequestMapping注解后,java对象会转换成json格式返回. 但实际上配合@ResponseBody注解后,接口返回的数据类型是根据HTTP Request Header中的Accept属性来确定的,可以是XML或者JSON数据 通过适当的HttpMessageC

随机推荐