最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java.io.File的renameTo方法移動(dòng)文件失敗的解決方案

 更新時(shí)間:2021年07月07日 11:14:45   作者:東都大狼狗  
這篇文章主要介紹了java.io.File的renameTo方法移動(dòng)文件失敗的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

今天線上發(fā)現(xiàn)一個(gè)問(wèn)題,發(fā)現(xiàn)一個(gè)定時(shí)移動(dòng)文件的業(yè)務(wù)沒(méi)有正常執(zhí)行,結(jié)合日志和代碼發(fā)現(xiàn),移動(dòng)文件是使用File類的renameTo方法,但是方法返回的都是false,表示文件移動(dòng)失敗。

出現(xiàn)這個(gè)問(wèn)題我第一反應(yīng)是不是文件權(quán)限的問(wèn)題,但是和運(yùn)維研究后發(fā)現(xiàn)的確不是權(quán)限導(dǎo)致的。既然不是權(quán)限的問(wèn)題,那就看看renameTo的實(shí)現(xiàn)吧,查看源碼發(fā)現(xiàn)該方法最終是通過(guò)一個(gè)本地方法實(shí)現(xiàn)的,看不到咋寫的。

網(wǎng)上查了一下renameTo這個(gè)方法,發(fā)現(xiàn)這個(gè)方法確實(shí)存在一些問(wèn)題,就是在不同的文件系統(tǒng)中移動(dòng)是不會(huì)成功的。因?yàn)闇y(cè)試環(huán)境并未出現(xiàn)這個(gè)問(wèn)題,我就把生產(chǎn)環(huán)境和測(cè)試環(huán)境對(duì)比了下,發(fā)現(xiàn)測(cè)試環(huán)境下,文件本身的目錄和要移動(dòng)到的目錄是在/home下,而生產(chǎn)環(huán)境中,文件本身目錄是在/home下,要移動(dòng)到的目錄都是在/data下。于是用df命令查看了一下,發(fā)現(xiàn) /home的文件系統(tǒng)是/dev/sda3,類型是xfs的,/data的文件系統(tǒng)是/dev/sdb1,類型是ext4。

既然是這樣那就寫個(gè)demo在自己的虛擬機(jī)上驗(yàn)證一下是不是這個(gè)原因?qū)е碌摹?/p>

1.首先找兩個(gè)文件系統(tǒng)不一樣的目錄,命令df -T

我們用/tmp 和 /run 作為測(cè)試目錄。

2.測(cè)試代碼

import java.io.File;
/**
* 文件移動(dòng)方法測(cè)試
*/
public class FileTest {
  public static void main(String[] args) {
     String filePath="/tmp/test.txt";
     File file = new File(filePath);
     boolean b = file.renameTo(new File("/run/test.txt"));
     System.out.println(b);
 }
}

3.編譯運(yùn)行

javac FileTest.java
java FileTest

運(yùn)行結(jié)果輸出false,文件也確實(shí)未移動(dòng)成功

解決方法:

使用apache的commons-io包中的工具類的進(jìn)行文件移動(dòng)。

1.測(cè)試代碼:

import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
/**
* 文件移動(dòng)方法測(cè)試
*/
public class FileTest {
  public static void main(String[] args) {
     String filePath="/tmp/test.txt";
     File file = new File(filePath);
     boolean b = file.renameTo(new File("/run/test.txt"));
     System.out.println(b);
     //使用apache的FileUtils工具
     try {
         FileUtils.moveFile(file,new File("/run/test.txt"));
         System.out.println("success");
     } catch (IOException e) {
         e.printStackTrace();
     }
 }
}

2.編譯運(yùn)行

javac -cp /root/jar/commons-io-2.4.jar FileTest.java
java -cp /root/jar/commons-io-2.4.jar: FileTest

運(yùn)行結(jié)果成功移動(dòng)文件

3.apache的FileUtils移動(dòng)文件方法的主要實(shí)現(xiàn)如下:

//先使用renameTo方法進(jìn)行移動(dòng)
boolean rename = srcFile.renameTo(destFile);
if (!rename) {
 //renameTo移動(dòng)失敗,就復(fù)制文件,然后刪除原文件
 copyFile( srcFile, destFile );
 if (!srcFile.delete()) {
 FileUtils.deleteQuietly(destFile);
 throw new IOException("Failed to delete original file '" + srcFile +
  "' after copy to '" + destFile + "'");
 }
}

總結(jié):

1、文件移動(dòng)最好不要使用Java的renameTo方法,而是應(yīng)該使用apache的commons-io包,當(dāng)然也可以自己封裝類似的方法。

2、renameTo方法移動(dòng)失敗是文件系統(tǒng)不同造成的,補(bǔ)充測(cè)試發(fā)現(xiàn)不同的文件系統(tǒng),就算類型相同,移動(dòng)也會(huì)失敗。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java三層架構(gòu)原理與作用小結(jié)

    java三層架構(gòu)原理與作用小結(jié)

    這篇文章主要對(duì)Java三層架構(gòu)的概念、作用等進(jìn)行了介紹,需要的朋友可以參考下
    2017-04-04
  • Java Collection和Collections的區(qū)別

    Java Collection和Collections的區(qū)別

    本文主要介紹了Java Collection和Collections的區(qū)別,Collection?是表示集合的接口,而?Collections?是對(duì)集合進(jìn)行操作的工具類,下面就來(lái)介紹一下具體用法,感興趣的可以了解一下
    2023-12-12
  • 詳解Java中ArrayList類

    詳解Java中ArrayList類

    這篇文章主要介紹了Java中ArrayList類,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • idea插件之如何使用JarEditor編輯Java JAR文件

    idea插件之如何使用JarEditor編輯Java JAR文件

    JarEditor是一款用于在IntelliJIDEA中直接編輯JAR文件的插件,支持反編譯查看和編輯.class文件,并提供即時(shí)編譯與保存功能,通過(guò)JarEditor,用戶可以在IDE內(nèi)一站式完成JAR文件的編輯、管理和打包操作,提高開發(fā)效率,但在生產(chǎn)環(huán)境中使用前,請(qǐng)確保備份并測(cè)試修改
    2025-01-01
  • Java多線程 生產(chǎn)者消費(fèi)者模型實(shí)例詳解

    Java多線程 生產(chǎn)者消費(fèi)者模型實(shí)例詳解

    這篇文章主要介紹了Java多線程 生產(chǎn)者消費(fèi)者模型實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Java中HashMap的put過(guò)程詳解

    Java中HashMap的put過(guò)程詳解

    這篇文章主要介紹了Java中HashMap的put過(guò)程詳解,HashMap有4個(gè)構(gòu)造器,其他構(gòu)造器如果用戶沒(méi)有傳入initialCapacity?和loadFactor這兩個(gè)參數(shù),會(huì)使用默認(rèn)值一般如果new?HashMap()不傳值,需要的朋友可以參考下
    2023-07-07
  • 基于Java實(shí)現(xiàn)收發(fā)電子郵件功能

    基于Java實(shí)現(xiàn)收發(fā)電子郵件功能

    Email就是電子郵件,我們平常使用的QQ郵箱,網(wǎng)易郵箱,F(xiàn)oxmail都是用來(lái)收發(fā)郵件的,利用Java程序也可以完成收發(fā)電子郵件的功能,本文就來(lái)為大家詳細(xì)講講實(shí)現(xiàn)步驟
    2022-07-07
  • Java使用遞歸回溯完美解決八皇后的問(wèn)題

    Java使用遞歸回溯完美解決八皇后的問(wèn)題

    這篇文章主要介紹了Java基于循環(huán)遞歸回溯實(shí)現(xiàn)八皇后問(wèn)題算法,結(jié)合具體實(shí)例形式分析了java的遍歷、遞歸、回溯等算法實(shí)現(xiàn)八皇后問(wèn)題的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2021-11-11
  • ActiveMQ基于zookeeper的主從(levelDB Master/Slave)搭建

    ActiveMQ基于zookeeper的主從(levelDB Master/Slave)搭建

    這篇文章主要介紹了ActiveMQ基于zookeeper的主從levelDB Master/Slave搭建,以及Spring-boot下的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • SpringBoot2.2.X用Freemarker出現(xiàn)404的解決

    SpringBoot2.2.X用Freemarker出現(xiàn)404的解決

    這篇文章主要介紹了SpringBoot2.2.X用Freemarker出現(xiàn)404的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02

最新評(píng)論

普格县| 天门市| 新泰市| 德州市| 涟水县| 安岳县| 梅河口市| 包头市| 沙田区| 涡阳县| 黔东| 文登市| 墨竹工卡县| 白沙| 平陆县| 当涂县| 宁海县| 南平市| 石台县| 宜兰市| 和顺县| 垣曲县| 高阳县| 治多县| 徐水县| 澄迈县| 浦城县| 泽库县| 波密县| 崇仁县| 姜堰市| 乌海市| 临邑县| 临城县| 乐业县| 酉阳| 厦门市| 凤山市| 旌德县| 桂平市| 潮安县|