IT/Java

[Java] 파일 이름 변경 / 이동하기

hi.anna 2021. 6. 26. 19:39

 

지난 포스팅들에서, Java에서 파일을 다루는 방법을 소개하였습니다.

[Java] 텍스트 파일 읽기 ( FileReader, BufferedReader, Scanner, Files )

[Java] 파일 생성하는 3가지 방법 (File, FileOutputStream, Files)

[Java] 파일, 디렉토리 존재 여부 확인하기

[Java] 파일에 텍스트 쓰기

[Java] 파일, 디렉토리 삭제하기

[Java] 현재 디렉토리 가져오기

[Java] 파일 사이즈 구하는 3가지 방법

[Java] 디렉토리 생성하기

[Java] 파일 또는 디렉토리 생성일자 구하기

[Java] 파일의 최종 수정일자 조회

[Java] 파일 최종수정일자 변경하기

[Java] Text 파일 라인수 세기

[Java] 텍스트 파일의 마지막 라인부터 읽기

[Java] 파일 특정 라인 읽기

[Java] 파일 복사하기

[Java] 파일에서 확장자 추출하기

 

이번에는 파일의 이름을 변경하거나 파일을 이동시키는 방법을 소개합니다.

  1. java.io.File의 renameTo()
  2. java.nio.file.Files.move()
  3. Guava 
  4. Apache Common IO

 

1. java.io.File의 renameTo()

Java 7 이전 버전에서는 File 클래스의 renameTo() 메소드를 이용하여

파일의 이름을 변경할 수 있습니다.

public boolean renameTo​(File dest)

이 메소드는 변경할 새로운 파일을 파라미터로 입력 받고,

파일이 정상적으로 이름변경이 되면 true를 리턴하고,

그렇지 않으면 false를 리턴합니다.

만약, 파라미터로 입력받은 dest의 path가 존재하지 않더라도,

exception을 발생시키지 않고, false를 리턴합니다.

 

  예제  

import java.io.File;

public class FileRename {
    public static void main(String[] args) {

        // 1. 원본 파일
        File file = new File("D:\\example\\image.jpg");

        // 2. new File
        File newFile = new File("D:\\example\\new_image.jpg");
        // File newFile = new File("D:\\example\\new_dir\\new_image.jpg");

        // 3. rename
        boolean result = file.renameTo(newFile);

        // 4. 결과 출력
        System.out.println(result);  // true

    }
}

example 디렉토리 안의 "image.jpg" 파일의 이름을 "new_image.jpg"로 변경하는 예제입니다.

정상적으로 파일의 이름이 변경되면 

renameTo() 메소드는 true를 리턴합니다.

하지만, 이름을 변경할 파일의 경로가 없는 경로일 경우

(10라인을 주석처리하고, 11라인의 주석을 풀고 테스트해보세요.)

renameTo() 메소드는 false를 리턴합니다.

 

 

 

2. java.nio.file.Files.move()

Java 7 이후부터는 nio의 Files 클래스의 move() 메소드를 이용해서

파일을 이동시키거나 이름을 변경할 수 있습니다.

public static Path move​(Path source, Path target, CopyOption... options) throws IOException

 

  예제  

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class FilesRename {
    public static void main(String[] args) {

        Path file = Paths.get("D:\\example\\image.jpg");
        Path newFile = Paths.get("D:\\example\\new_image.jpg");

        try {

            Path newFilePath = Files.move(file, newFile);

            System.out.println(newFilePath); // D:\example\new_image.jpg

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Files.move() 메소드를 이용하여 파일의 이름을 변경(이동)시킨 예제입니다.

만약 newFile이 이미 존재하면, java.nio.file.FileAlreadyExistsException이 발생합니다.

 

  예제 - 덮어쓰기  

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;

public class FilesRename {
    public static void main(String[] args) {

        Path file = Paths.get("D:\\example\\image.jpg");
        Path newFile = Paths.get("D:\\example\\new_image.jpg");

        try {

            Path newFilePath = Files.move(file, newFile, StandardCopyOption.REPLACE_EXISTING);
            // D:\example\new_image.jpg

            System.out.println(newFilePath); 

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

대상 파일이 이미 존재할 경우, 파일을 덮어쓰고 싶으면

Files.move() 메소드의 3번째 파라미터로 'StandardCopyOption.REPLACE_EXISTING'을 전달하면,

기존 파일이 존재할 경우 파일을 덮어씁니다.

 

  예제 - Path가 존재하지 않을 경우 Exception 발생  

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class FilesRename {
    public static void main(String[] args) {

        Path file = Paths.get("D:\\example\\image.jpg");
        Path newFile = Paths.get("D:\\example\\new_directory\\new_image.jpg");

        try {

            Path newFilePath = Files.move(file, newFile);
            // java.nio.file.FileSystemException 발생

            System.out.println(newFilePath); 

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

파일을 이동시킬 디렉토리가 존재하지 않으면,

java.nio.file.FileSystemException이 발생합니다.

 

 

 

3. Guava 

Guave 라이브러리를 이용해서, File의 이름을 변경할 수도 있습니다.

    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>30.1.1-jre</version>
    </dependency>

 

com.google.common.io.Files.move() 메소드를 이용해서 파일을 이동하거나, 이름을 변경할 수 있습니다.

public static void move(File from, File to) throws IOException

Java 7 이전에서 파일의 이름을 변경할 때 사용했던, renameTo() 메소드 대신

Guava의 위 메소드를 사용하면,

파일 이름변경이나 이동이 실패했을 경우,

그에 따른 적절한 Exception이 발생합니다.

 

  예제  

import java.io.File;
import java.io.IOException;

import com.google.common.io.Files;

public class GuavaFileReanme {
    public static void main(String[] args) {
        // 1. 원본 파일
        File file = new File("D:\\example\\image.jpg");

        // 2. new File
        File newFile = new File("D:\\example\\new_image.jpg");

        try {
            // 3. 파일 이름 변경
            Files.move(file, newFile);
        } catch (IOException e) {
            e.printStackTrace();
        }    
    }
}

 

 

 

4. Apache Common IO

Apache Common IO도 파일 이름 변경, 이동 메소드를 제공합니다.

    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.9.0</version>
    </dependency>

 

org.apache.commons.io.FileUtils.moveFile() 메소드를 이용합니다.

public static void moveFile(File srcFile,File destFile) throws IOException

 

  예제  

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;

public class ApacheFileRename {
    public static void main(String[] args) {
        
        // 1. 원본 파일
        File file = new File("D:\\example\\image.jpg");

        // 2. new File
        File newFile = new File("D:\\example\\new_image.jpg");

        try {
            // 3. 파일 이름 변경
            FileUtils.moveFile(file, newFile);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 


 

java.io.File, java.nio.file.Files, Guava, Apache Common IO를 이용하여

파일의 이름을 변경하거나 이동시키는 방법을 알아보았습니다.

 

 

반응형