1. 개요

이 기사에서는 Java에서 파일을 복사하는 일반적인 방법에 대해 설명합니다.

먼저 표준 IONIO.2 API와 두 개의 외부 라이브러리 인 commons-ioguava를 사용 합니다.

2. IO API (JDK7 이전)

우선, java.io API 로 파일 복사 하려면 스트림을 열고 콘텐츠를 반복하여 다른 스트림에 기록해야합니다.

@Test
public void givenIoAPI_whenCopied_thenCopyExistsWithSameContents() 
  throws IOException {
 
    File copied = new File("src/test/resources/copiedWithIo.txt");
    try (
      InputStream in = new BufferedInputStream(
        new FileInputStream(original));
      OutputStream out = new BufferedOutputStream(
        new FileOutputStream(copied))) {
 
        byte[] buffer = new byte[1024];
        int lengthRead;
        while ((lengthRead = in.read(buffer)) > 0) {
            out.write(buffer, 0, lengthRead);
            out.flush();
        }
    }
 
    assertThat(copied).exists();
    assertThat(Files.readAllLines(original.toPath())
      .equals(Files.readAllLines(copied.toPath())));
}

이러한 기본 기능을 구현하기 위해 많은 작업이 필요합니다.

다행히도 Java는 핵심 API를 개선했으며 NIO.2 API를 사용하여 파일을 복사하는 더 간단한 방법을 가지고 있습니다 .

3. NIO.2 API (JDK7)

사용 NIO.2하는 것은 상당히 이후 성능을 복사 파일을 증가시킬 수 NIO.2이 낮은 수준의 시스템 진입 점을 사용합니다.

파일 방법을 자세히 살펴 보겠습니다. copy () 메서드가 작동합니다.

사본 () 메소드는 우리에게 복사 옵션을 나타내는 선택적 인수를 지정할 수있는 기능을 제공합니다. 기본적으로 파일 및 디렉터리 복사는 기존 항목을 덮어 쓰지 않으며 파일 속성을 복사하Map 않습니다.

이 동작은 다음 복사 옵션을 사용하여 변경할 수 있습니다.

  • REPLACE_EXISTING – 파일이있는 경우 교체
  • COPY_ATTRIBUTES – 메타 데이터를 새 파일로 복사
  • NOFOLLOW_LINKS – 심볼릭 링크를 따라 가면 안됩니다.

NIO.2 파일 클래스는 오버로드의 세트 제공 사본 () 파일 시스템 내에서 파일과 디렉토리를 복사하는 방법.

두 개의 Path 인수 와 함께 copy ()사용하는 예제를 살펴 보겠습니다 .

@Test
public void givenNIO2_whenCopied_thenCopyExistsWithSameContents() 
  throws IOException {
 
    Path copied = Paths.get("src/test/resources/copiedWithNio.txt");
    Path originalPath = original.toPath();
    Files.copy(originalPath, copied, StandardCopyOption.REPLACE_EXISTING);
 
    assertThat(copied).exists();
    assertThat(Files.readAllLines(originalPath)
      .equals(Files.readAllLines(copied)));
}

그 주 디렉토리를 복사 얕은있는 디렉토리 내 파일과 하위 디렉토리를 복사하지 않는 것을 의미한다.

4. Apache Commons IO

Java로 파일을 복사하는 또 다른 일반적인 방법은 commons-io 라이브러리를 사용하는 것 입니다.

먼저 의존성을 추가해야합니다.

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

최신 버전은 Maven Central 에서 다운로드 할 수 있습니다 .

그런 다음 파일을 복사 하려면 FileUtils 클래스에 정의 된 copyFile () 메서드 를 사용해야합니다 . 이 메서드는 소스 및 대상 파일을 사용합니다.

copyFile () 메서드를 사용하여 JUnit 테스트를 살펴 보겠습니다 .

@Test
public void givenCommonsIoAPI_whenCopied_thenCopyExistsWithSameContents() 
  throws IOException {
    
    File copied = new File(
      "src/test/resources/copiedWithApacheCommons.txt");
    FileUtils.copyFile(original, copied);
    
    assertThat(copied).exists();
    assertThat(Files.readAllLines(original.toPath())
      .equals(Files.readAllLines(copied.toPath())));
}

5. 구아바

마지막으로 Google의 Guava 라이브러리를 살펴 보겠습니다.

우리는 구아바를 사용하려면 다시 한번 , 우리는 의존성을 포함해야합니다 :

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>23.0</version>
</dependency>

최신 버전은 Maven Central 에서 찾을 수 있습니다 .

다음은 Guava의 파일 복사 방법입니다.

@Test
public void givenGuava_whenCopied_thenCopyExistsWithSameContents() 
  throws IOException {
 
    File copied = new File("src/test/resources/copiedWithGuava.txt");
    com.google.common.io.Files.copy(original, copied);
 
    assertThat(copied).exists();
    assertThat(Files.readAllLines(original.toPath())
      .equals(Files.readAllLines(copied.toPath())));
}

6. 결론

이 기사에서는 Java에서 파일을 복사하는 가장 일반적인 방법을 살펴 보았습니다.

이 기사의 전체 구현은 Github 에서 찾을 수 있습니다 .