java.io.File 의 renameTo 방법 으로 파일 을 이동 하 는 데 실패 한 해결 방안
이 문제 가 발생 하면 저 는 첫 번 째 반응 이 파일 권한 의 문제 가 아니 라 는 것 을 알 게 되 었 습 니 다.그러나 운영 연 구 를 통 해 권한 으로 인 한 것 이 아니 라 는 것 을 알 게 되 었 습 니 다.권한 의 문제 가 아 닌 이상 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 방법 이동 실 패 는 파일 시스템 에 따라 발생 합 니 다.추가 테스트 에서 서로 다른 파일 시스템 을 발견 하면 유형 이 같 더 라 도 이동 에 실패 합 니 다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.