java.io.File 의 renameTo 방법 으로 파일 을 이동 하 는 데 실패 한 해결 방안

오늘 온라인 에서 문 제 를 발 견 했 습 니 다.정시 에 파일 을 이동 하 는 업무 가 정상적으로 실행 되 지 않 은 것 을 발 견 했 습 니 다.로그 와 코드 를 결합 하여 이동 파일 은 File 류 의 renameTo 방법 을 사용 하지만 방법 은 모두 false 로 되 돌아 와 파일 이동 에 실 패 했 음 을 나타 냅 니 다.
이 문제 가 발생 하면 저 는 첫 번 째 반응 이 파일 권한 의 문제 가 아니 라 는 것 을 알 게 되 었 습 니 다.그러나 운영 연 구 를 통 해 권한 으로 인 한 것 이 아니 라 는 것 을 알 게 되 었 습 니 다.권한 의 문제 가 아 닌 이상 renameTo 의 실현 을 살 펴 보 세 요.소스 코드 를 보면 이 방법 은 최종 적 으로 로 컬 방법 으로 이 루어 진 것 이 고 어떻게 쓰 는 지 볼 수 없습니다.
인터넷 에서 renameTo 라 는 방법 을 찾 아 보 니 이 방법 에 확실히 문제 가 존재 하 는 것 을 발견 했다.즉,서로 다른 파일 시스템 에서 이동 하 는 것 은 성공 하지 못 할 것 이다.테스트 환경 에 이런 문제 가 발생 하지 않 았 기 때문에 저 는 생산 환경 과 테스트 환경 을 비교 해 보 았 습 니 다.테스트 환경 에서 파일 자체 의 디 렉 터 리 와 이동 할 디 렉 터 리 는/home 에 있 고 생산 환경 에서 파일 자체 의 디 렉 터 리 는/home 에 있 으 며 이동 할 디 렉 터 리 는 모두/data 에 있 습 니 다.그래서 df 명령 으로 살 펴 보 니/home 의 파일 시스템 은/dev/sda 3 이 고 형식 은 xfs 이 며/data 의 파일 시스템 은/dev/sdb 1 이 며 형식 은 ext 4 입 니 다.
그렇다면 demo 를 써 서 자신의 가상 컴퓨터 에 이 원인 이 맞 는 지 확인 해 보 세 요.
1.우선 두 파일 시스템 이 다른 디 렉 터 리 를 찾 아 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
실행 결과 출력 false,파일 도 확실히 이동 하지 못 했 습 니 다.

해결 방법:
apache 의 comons-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.파일 이동 은 자바 의 renameTo 방법 을 사용 하지 않 고 apache 의 comons-io 가방 을 사용 하 는 것 이 좋 습 니 다.물론 비슷 한 방법 을 스스로 포장 할 수도 있 습 니 다.
2.renameTo 방법 이동 실 패 는 파일 시스템 에 따라 발생 합 니 다.추가 테스트 에서 서로 다른 파일 시스템 을 발견 하면 유형 이 같 더 라 도 이동 에 실패 합 니 다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기