java file.renameTo返回false的原因及解決方案
java file.renameTo返回false原因
需要對(duì)文件夾下的文件重命名,發(fā)現(xiàn)返回false了,先用main方法測(cè)試,發(fā)現(xiàn)沒(méi)問(wèn)題,如下
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
}
最后發(fā)現(xiàn),是一個(gè)文件是用文件流寫(xiě)的,流沒(méi)用close,導(dǎo)致文件重命名失敗了,模擬如下
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
}
最終也是很好解決
找個(gè)合適的地方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方法,需要注意的坑
最近在接手老項(xiàng)目的時(shí)候,遇到File.renameTo(File file)方法,不清楚特性,于是研究了下源碼,發(fā)現(xiàn)底層調(diào)用的是Native方法實(shí)現(xiàn)的。
本身帶著對(duì)其用法的困惑,寫(xiě)了一個(gè)測(cè)試用例來(lái)揭開(kāi)它的神秘面紗,發(fā)現(xiàn)兩個(gè)在使用時(shí)值得注意的點(diǎn)。
測(cè)試用例代碼如下:
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();
}
}
//調(diào)用renameTo()前
System.out.println(file.exists());
file.renameTo(new File("f:\\2.txt"));
//調(diào)用renameTo()后
System.out.println(file.exists());
}
}
第一次運(yùn)行程序,目錄下1.txt和2.txt均不存在
得到結(jié)果如下:


可以看出調(diào)用renameTo前后,1.txt先是存在,然后消失,最后文件夾中生成了2.txt。
為了方便比較第二次結(jié)果,往2.txt寫(xiě)入些內(nèi)容,“hello world!”(原諒我的中二 ^-^)

第二次運(yùn)行程序,目錄下已存在2.txt,得到結(jié)果如下:



2.txt中的內(nèi)容并沒(méi)有被替換掉,證明此次重命名沒(méi)有成功。
總結(jié):
- 如果被重命名的文件已存在,那么renameTo()不會(huì)成功
- renameTo()成功后,原文件會(huì)被刪除
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java接口返回省市區(qū)樹(shù)形結(jié)構(gòu)的實(shí)現(xiàn)
本文主要介紹了Java接口返回省市區(qū)樹(shù)形結(jié)構(gòu)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
SpringMvc @RequestParam 使用推薦使用包裝類(lèi)型代替包裝類(lèi)型
這篇文章主要介紹了SpringMvc @RequestParam 使用推薦使用包裝類(lèi)型代替包裝類(lèi)型,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-02-02
Java開(kāi)發(fā)druid數(shù)據(jù)連接池maven方式簡(jiǎn)易配置流程示例
本篇文章主要為大家介紹了java開(kāi)發(fā)中druid數(shù)據(jù)連接池maven方式的簡(jiǎn)易配置流程示例,文中附含詳細(xì)的代碼示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10
mybatis批量插入時(shí),有字段可能為null會(huì)報(bào)錯(cuò)問(wèn)題
這篇文章主要介紹了mybatis批量插入時(shí),有字段可能為null會(huì)報(bào)錯(cuò)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
詳解IDEA中SpringBoot整合Servlet三大組件的過(guò)程
這篇文章主要介紹了詳解IDEA中SpringBoot整合Servlet三大組件的過(guò)程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
spring/springboot整合dubbo詳細(xì)教程
今天教大家如何使用spring/springboot整合dubbo,文中有非常詳細(xì)的圖文介紹及代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴有很好地幫助,需要的朋友可以參考下2021-05-05
教你安裝eclipse2021并配置內(nèi)網(wǎng)maven中心倉(cāng)庫(kù)的圖文詳解
本文能通過(guò)圖文并茂的形式給大家介紹安裝eclipse2021并配置內(nèi)網(wǎng)maven中心倉(cāng)庫(kù)的相關(guān)知識(shí),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-09-09

