개발 & 데이터베이스/JAVA

자바 파일 복사하는 4가지 방법

K.두부 2022. 10. 14. 01:21
반응형

안녕하세요. 두부입니다.

이번엔 자바로 파일을 복사하는 방법에 대해서 포스팅해보려고합니다.

자바로 파일을 복사하는 4가지 방법을 알려드릴텐데 아래 방식만 알아도 파일을 복사하는데는 큰 어려움이 없을 것이라고 생각합니다.

 

현재 C:/test 경로에 excel_test.cell 이라는 파일이 있습니다. 이 파일을 4가지 방법으로 복사해보겠습니다.

 

자바로 파일 복사하는 방법

1. FileInputStream / FileOutputStream

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        String orgFilePath = "C:/test/excel_test.cell";
        String copyFilePath = "C:/test/excel_copy.cell";
	    
        try {
            FileInputStream fis = new FileInputStream(orgFilePath);
            FileOutputStream fos = new FileOutputStream(copyFilePath);
	        
            byte[] b = new byte[1024]; // 버퍼 생성
            int len;
    
            // 버퍼에 데이터를 담아서 0번째 offset부터 1024 길이만큼 FileOutputStream에 쓴다.
            while ((len = fis.read(b, 0, 1024)) > 0) {
                fos.write(b, 0, len);
            }
	        
            fis.close();
            fos.close();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

가장 오래된 방법으로 I/O 을 사용해서 버퍼로 읽은 총 byte 수를 복사하는 방법입니다.

 

2. Files.Copy

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;

public class Main {
    public static void main(String[] args) throws IOException {
        String orgFilePath = "C:/test/excel_test.cell";
        String copyFilePath = "C:/test/excel_copy.cell";
	    
        try {
            File orgFile = new File(orgFilePath);
            File copyFile = new File(copyFilePath);
	        
            Files.copy(orgFile.toPath(), copyFile.toPath());
	        
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

java.nio 패키지를 이용한 파일 복사 방법입니다. 

Files.copy(Path source, Path target, options);

⑴ Path source: 복사할 파일

⑵ Path target: 복사된 파일

⑶ options

     ┕ REPLACE_EXISTING: target 파일이 존재하면 덮어쓴다.

     ┕ COPY_ATTRIBUTES: 파일 attribute를 복사한다.

     ┕ NOFOLLOW_LINKS: 파일이 sysmbolic link이면 링크 대상이 아닌 symbolic link 자체가 복사된다.

 

3. FileChannel

import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;

public class Main {
    public static void main(String[] args) throws IOException {
        String orgFilePath = "C:/test/excel_test.cell";
        String copyFilePath = "C:/test/excel_copy.cell";
	    
        try {
            RandomAccessFile orgFile = new RandomAccessFile(orgFilePath, "r");
            RandomAccessFile copyFile = new RandomAccessFile(copyFilePath, "rw");
	        
            FileChannel source = orgFile.getChannel();
            FileChannel target = copyFile.getChannel();
	        
            // source.transferTo(0, source.size(), target);
            // target.transferFrom(source, 0, source.size());
	        
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

FileChannel 클래스는 파일의 읽기, 쓰기 등을 위한 채널을 제공합니다.

transferTo(), transferFrom() 메소드 두 가지가 존재합니다. 필요에 따라 구분해서 사용하시면 됩니다.

// src 채널로부터 position 위치부터 count 사이즈만큼 복사
source.transferTo(ReadableByteChannel src, long position, long count);
// target 채널로 position 위치부터 count 사이즈만큼 복사
target.transferFrom(long position, long count, WritableByteChannel target);

이 메소드의 경우에는 길이만큼 복사해주는 것이기 때문에 target 파일이 이미 존재하고 아래와 같이 데이터가 들어있다면  예외가 발생한다.

  • source 파일: "1234"
  • target 파일: "5678910"

target 파일: "1234910" 이 된다. 

 

4. FileUtils (Apache Commons IO)

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.0</version>
</dependency>
import org.apache.commons.io.FileUtils;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        String orgFilePath = "C:/test/excel_test.cell";
        String copyFilePath = "C:/test/excel_copy.cell";
	    
        try {
            File orgFile = new File(orgFilePath);
            File copyFile = new File(copyFilePath);
            
            FileUtils.copyFile(orgFile, copyFile);
	        
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

Apache Commons IO 라이브러리를 사용하기 때문에 pom.xml에 dependency를 추가해줘야 사용이 가능합니다.

 

결과 화면

 

반응형