1. 소개

이 짧은 예제에서는 모든 파일과 하위 디렉토리를 포함하여 Java에서 디렉토리를 복사하는 방법을 알아 봅니다. 이는 핵심 Java 기능 또는 타사 라이브러리를 사용하여 수행 할 수 있습니다.

2. java.nio API 사용

Java NIO 는 Java 1.4부터 사용할 수 있습니다. Java 7은 기호 링크 처리, 파일 속성 액세스에 대한 더 나은 지원과 같은 많은 유용한 기능을 제공하는 NIO 2 를 도입했습니다. 또한 Path , PathsFiles 와 같은 클래스를 제공 하여 파일 시스템을 훨씬 쉽게 조작 할 수 있습니다.

이 접근 방식을 시연 해 보겠습니다.

public static void copyDirectory(String sourceDirectoryLocation, String destinationDirectoryLocation) 
  throws IOException {
    Files.walk(Paths.get(sourceDirectoryLocation))
      .forEach(source -> {
          Path destination = Paths.get(destinationDirectoryLocation, source.toString()
            .substring(sourceDirectoryLocation.length()));
          try {
              Files.copy(source, destination);
          } catch (IOException e) {
              e.printStackTrace();
          }
      });
}

이 예제에서 우리는 Files.walk ()를 사용하여 주어진 소스 디렉토리에 뿌리를 둔 파일 트리를 살펴보고 소스 디렉토리 에서 찾은 각 파일 또는 디렉토리에 대해 Files.copy ()호출했습니다 .

3. java.io API 사용

Java 7은 새롭고 편리한 기능을 많이 도입했기 때문에 파일 시스템 관리 관점에서 전환점이되었습니다.

그러나 이전 Java 버전과의 호환성을 유지하려면 재귀 및 java.io.File 기능을 사용하여 디렉토리 복사 할 수 있습니다 .

private static void copyDirectory(File sourceDirectory, File destinationDirectory) throws IOException {
    if (!destinationDirectory.exists()) {
        destinationDirectory.mkdir();
    }
    for (String f : sourceDirectory.list()) {
        copyDirectoryCompatibityMode(new File(sourceDirectory, f), new File(destinationDirectory, f));
    }
}

이 경우 소스 디렉터리 트리의 모든 디렉터리에 대해 대상 디렉터리에 디렉터리를 만듭니다 . 그런 다음 copyDirectoryCompatibityMode () 메서드를 호출합니다 .

public static void copyDirectoryCompatibityMode(File source, File destination) throws IOException {
    if (source.isDirectory()) {
        copyDirectory(source, destination);
    } else {
        copyFile(source, destination);
    }
}

또한 FileInputStreamFileOutputStream을 사용하여 파일을 복사하는 방법을 살펴 보겠습니다 .

private static void copyFile(File sourceFile, File destinationFile) 
  throws IOException {
    try (InputStream in = new FileInputStream(sourceFile); 
      OutputStream out = new FileOutputStream(destinationFile)) {
        byte[] buf = new byte[1024];
        int length;
        while ((length = in.read(buf)) > 0) {
            out.write(buf, 0, length);
        }
    }
}

4. Apache Commons IO 사용

Apache Commons IO 에는 유틸리티 클래스, 파일 필터 및 파일 비교기와 같은 유용한 기능이 많이 있습니다. 여기서는 읽기, 이동, 복사와 같은 쉬운 파일 및 디렉토리 조작 방법을 제공 하는 FileUtils 를 사용합니다.

commons-iopom.xml 파일에 추가해 보겠습니다  .

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

마지막으로 다음 접근 방식을 사용하여 디렉토리를 복사 해 보겠습니다.

public static void copyDirectory(String sourceDirectoryLocation, String destinationDirectoryLocation) throws IOException {
    File sourceDirectory = new File(sourceDirectoryLocation);
    File destinationDirectory = new File(destinationDirectoryLocation);
    FileUtils.copyDirectory(sourceDirectory, destinationDirectory);
}

이전 예제에서 볼 수 있듯이 Apache Commons IO는 FileUtils.copyDirectory ()  메서드 를 호출하기 만하면 되기 때문에 모든 작업을 훨씬 쉽게 만듭니다 .

5. 결론

이 기사에서는 Java에서 디렉토리를 복사하는 방법을 설명했습니다. 전체 코드 샘플은 GitHub에서 사용할 수 있습니다 .