溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何解決java.io.File的renameTo方法移動文件失敗的問題

發布時間:2021-07-07 17:28:44 來源:億速云 閱讀:603 作者:chen 欄目:開發技術

本篇內容主要講解“如何解決java.io.File的renameTo方法移動文件失敗的問題”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何解決java.io.File的renameTo方法移動文件失敗的問題”吧!

今天線上發現一個問題,發現一個定時移動文件的業務沒有正常執行,結合日志和代碼發現,移動文件是使用File類的renameTo方法,但是方法返回的都是false,表示文件移動失敗。

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

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

既然是這樣那就寫個demo在自己的虛擬機上驗證一下是不是這個原因導致的。

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

如何解決java.io.File的renameTo方法移動文件失敗的問題

我們用/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

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

如何解決java.io.File的renameTo方法移動文件失敗的問題

解決方法:

使用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

運行結果成功移動文件

3.apache的FileUtils移動文件方法的主要實現如下:

//先使用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 + "'");
 }
}

總結:

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

2、renameTo方法移動失敗是文件系統不同造成的,補充測試發現不同的文件系統,就算類型相同,移動也會失敗。

到此,相信大家對“如何解決java.io.File的renameTo方法移動文件失敗的問題”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女