亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java.io.File的renameTo方法移動文件失敗的解決方案

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

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

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

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

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

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

我們用/tmp 和 /run 作為測試目錄。

2.測試代碼

import java.io.File;
/**
* 文件移動方法測試
*/
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.編譯運行

javac FileTest.java
java FileTest

運行結(jié)果輸出false,文件也確實未移動成功

解決方法:

使用apache的commons-io包中的工具類的進行文件移動。

1.測試代碼:

import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
/**
* 文件移動方法測試
*/
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.編譯運行

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

運行結(jié)果成功移動文件

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

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

總結(jié):

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

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

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

相關文章

  • SpringBoot實現(xiàn)API接口的完整代碼

    SpringBoot實現(xiàn)API接口的完整代碼

    這篇文章主要給大家介紹了關于SpringBoot實現(xiàn)API接口的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • 詳解Java MyBatis 插入數(shù)據(jù)庫返回主鍵

    詳解Java MyBatis 插入數(shù)據(jù)庫返回主鍵

    這篇文章主要介紹了詳解Java MyBatis 插入數(shù)據(jù)庫返回主鍵,有興趣的可以了解一下。
    2017-01-01
  • list的4種遍歷方式(實例講解)

    list的4種遍歷方式(實例講解)

    下面小編就為大家?guī)硪黄猯ist的4種遍歷方式(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • Java結(jié)束線程的三種方法及該如何選擇

    Java結(jié)束線程的三種方法及該如何選擇

    這篇文章主要介紹了Java結(jié)束線程的三種方法及該如何選擇,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下
    2021-03-03
  • springboot2 生產(chǎn)部署注意事項及示例代碼

    springboot2 生產(chǎn)部署注意事項及示例代碼

    這篇文章主要介紹了springboot2 生產(chǎn)部署注意事項及示例代碼,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04
  • 關于SpringGateway調(diào)用服務 接受不到參數(shù)問題

    關于SpringGateway調(diào)用服務 接受不到參數(shù)問題

    這篇文章主要介紹了關于SpringGateway調(diào)用服務接受不到參數(shù)問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Java中拼接字符串String的N種方法總結(jié)

    Java中拼接字符串String的N種方法總結(jié)

    字符串拼接是我們在Java代碼中比較經(jīng)常要做的事情,就是把多個字符串拼接到一起,下面這篇文章主要給大家介紹了關于Java中拼接String的N種方法,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-02-02
  • Java中super和this關鍵字詳解

    Java中super和this關鍵字詳解

    這篇文章主要介紹了Java中super和this關鍵字詳解,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-06-06
  • java.lang.IllegalStateException:方法有太多主體參數(shù)問題

    java.lang.IllegalStateException:方法有太多主體參數(shù)問題

    這篇文章主要介紹了java.lang.IllegalStateException:方法有太多主體參數(shù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • java?CompletableFuture異步任務編排示例詳解

    java?CompletableFuture異步任務編排示例詳解

    這篇文章主要為大家介紹了java?CompletableFuture異步任務編排示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11

最新評論