Java 파일 복사 – Java에서 파일 복사하는 4가지 방법

자바 파일 복사는 매우 일반적인 작업입니다. 그러나 java.io.File 클래스에는 소스에서 대상으로 파일을 복사하는 단축 메서드가 없습니다. 여기에서는 자바에서 파일을 복사하는 네 가지 다른 방법을 배우게 됩니다.

자바 파일 복사

  1. 자바 파일 복사 – 스트림

이것은 자바에서 파일을 복사하는 전통적인 방법입니다. 여기에서는 소스와 대상 두 개의 파일을 생성합니다. 그런 다음 소스에서 InputStream을 생성하고 자바 파일 복사 작업에 대한 대상 파일에 쓰기 위해 OutputStream을 사용합니다. 다음은 스트림을 사용하여 자바 파일 복사에 사용할 수 있는 메서드입니다.

private static void copyFileUsingStream(File source, File dest) throws IOException {
    InputStream is = null;
    OutputStream os = null;
    try {
        is = new FileInputStream(source);
        os = new FileOutputStream(dest);
        byte[] buffer = new byte[1024];
        int length;
        while ((length = is.read(buffer)) > 0) {
            os.write(buffer, 0, length);
        }
    } finally {
        is.close();
        os.close();
    }
}
  1. 자바 파일 복사 – java.nio.channels.FileChannel

자바 1.4에서 소개된 자바 NIO 클래스는 파일을 복사하는 데 사용할 수 있는 FileChannel을 사용할 수 있습니다. transferFrom() 메서드 javadoc에 따르면, 이 방법은 자바 파일 복사에 스트림을 사용하는 것보다 빠르다고 합니다. 다음은 FileChannel을 사용하여 파일을 복사하는 데 사용할 수 있는 메서드입니다.

private static void copyFileUsingChannel(File source, File dest) throws IOException {
    FileChannel sourceChannel = null;
    FileChannel destChannel = null;
    try {
        sourceChannel = new FileInputStream(source).getChannel();
        destChannel = new FileOutputStream(dest).getChannel();
        destChannel.transferFrom(sourceChannel, 0, sourceChannel.size());
       }finally{
           sourceChannel.close();
           destChannel.close();
   }
}
  1. 자바 파일 복사 – Apache Commons IO FileUtils

Apache Commons IO FileUtils.copyFile(File srcFile, File destFile)는 자바에서 파일을 복사하는 데 사용될 수 있습니다. 프로젝트에서 이미 Apache Commons IO를 사용하고 있다면 코드 간결성을 위해 이를 사용하는 것이 합리적입니다. 내부적으로 Java NIO FileChannel을 사용하므로 다른 기능에 이미 사용 중이지 않은 경우에는 이 래퍼 메서드를 피할 수 있습니다. 여기 자바 파일 복사 작업에 apache commons io를 사용하는 방법입니다.

private static void copyFileUsingApacheCommonsIO(File source, File dest) throws IOException {
    FileUtils.copyFile(source, dest);
}
  1. 자바 파일 복사 – Files 클래스

Java 7 이상에서 작업 중이라면 Files 클래스의 copy() 메서드를 사용하여 자바에서 파일을 복사할 수 있습니다. 이는 파일 시스템 제공자를 사용하여 파일을 복사합니다.

private static void copyFileUsingJava7Files(File source, File dest) throws IOException {
    Files.copy(source.toPath(), dest.toPath());
}

이제 어떤 방법이 가장 빠른지 알아보기 위해 테스트 클래스를 작성하고 위의 방법들을 하나씩 실행하여 1 GB 파일을 복사했습니다. 각 호출에서 나중의 방법이 캐시 때문에 이점을 얻지 못하도록 서로 다른 파일을 사용했습니다.

package com.journaldev.files;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.channels.FileChannel;
import java.nio.file.Files;

import org.apache.commons.io.FileUtils;

public class JavaCopyFile {

    public static void main(String[] args) throws InterruptedException, IOException {
        File source = new File("/Users/pankaj/tmp/source.avi");
        File dest = new File("/Users/pankaj/tmp/dest.avi");

        //스트림을 사용하여 파일을 전통적인 방식으로 복사합니다
        long start = System.nanoTime();
        copyFileUsingStream(source, dest);
        System.out.println("Time taken by Stream Copy = "+(System.nanoTime()-start));
        
        //java.nio FileChannel을 사용하여 파일을 복사합니다
        source = new File("/Users/pankaj/tmp/sourceChannel.avi");
        dest = new File("/Users/pankaj/tmp/destChannel.avi");
        start = System.nanoTime();
        copyFileUsingChannel(source, dest);
        System.out.println("Time taken by Channel Copy = "+(System.nanoTime()-start));
        
        //apache commons io를 사용하여 파일을 복사합니다
        source = new File("/Users/pankaj/tmp/sourceApache.avi");
        dest = new File("/Users/pankaj/tmp/destApache.avi");
        start = System.nanoTime();
        copyFileUsingApacheCommonsIO(source, dest);
        System.out.println("Time taken by Apache Commons IO Copy = "+(System.nanoTime()-start));
        
        //Java 7 Files 클래스를 사용합니다
        source = new File("/Users/pankaj/tmp/sourceJava7.avi");
        dest = new File("/Users/pankaj/tmp/destJava7.avi");
        start = System.nanoTime();
        copyFileUsingJava7Files(source, dest);
        System.out.println("Time taken by Java7 Files Copy = "+(System.nanoTime()-start));        
    }
}

위 프로그램의 출력은 다음과 같습니다. 각 코드를 주석 처리하여 매번 자바 파일 복사 작업에 한 가지 방법만 사용되도록 했습니다.

Time taken by Stream Copy = 44582575000
Time taken by Channel Copy = 104138195000
Time taken by Apache Commons IO Copy = 108396714000
Time taken by Java7 Files Copy = 89061578000

다음은 Stream Copy가 Java에서 파일을 복사하는 최상의 방법임이 명확합니다. 그러나 이는 매우 기본적인 테스트입니다. 성능 중심 프로젝트에서 작업 중이라면 Java 파일 복사를 위한 다양한 방법을 시도하고 프로젝트에 가장 적합한 방법을 찾기 위해 시간을 측정해야 합니다. 또한 파일의 평균 크기를 기준으로 다양한 방법으로 Java 파일 복사를 실험해보세요. Java에서 파일을 복사하는 4가지 방법에 대한 YouTube 비디오를 만들었으며, 더 알아보려면 이 비디오를 시청할 수 있습니다. https://www.youtube.com/watch?v=op6tgG95zek

Source:
https://www.digitalocean.com/community/tutorials/java-copy-file