1. 序章

この短いチュートリアルでは、Javaのディレクトリを、そのすべてのファイルとサブディレクトリを含めてコピーする方法を説明します。 これは、コアJava機能またはサードパーティライブラリを使用して実現できます。

2. java .nioAPIの使用

Java NIO は、Java1.4から使用可能になっています。 Java7ではNIO2 が導入され、シンボリックリンクの処理のサポートの向上、ファイル属性へのアクセスなど、多くの便利な機能が提供されました。 また、 Path Paths Files などのクラスが提供され、ファイルシステムの操作がはるかに簡単になりました。

このアプローチを示しましょう:

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 .ioAPIの使用

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);
    }
}

また、FileInputStreamとFileOutputStreamを使用してファイルをコピーする方法を見てみましょう。

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. ApacheCommonsIOの使用

Apache Commons IO には、ユーティリティクラス、ファイルフィルタ、ファイルコンパレータなどの便利な機能がたくさんあります。ここでは、簡単なメソッドを提供するFileUtilsを使用します。ファイルとディレクトリの操作、つまり、読み取り、移動、コピー。

commons-iopom.xmlファイルに追加しましょう。

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.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);
}

前の例で示したように、 FileUtils.copyDirectory()メソッドを呼び出すだけでよいため、ApacheCommonsIOを使用するとすべてがはるかに簡単になります。

5. 結論

この記事では、Javaでディレクトリをコピーする方法について説明しました。 完全なコードサンプルは、GitHubから入手できます。