Java java.nio.file.Files copy() メソッド

Java File Java java.nio.file.Files


java.nio.file.Files.copy()Java NIO (New Input/Output) パッケージで提供されるユーティリティメソッドで、ファイルシステム間でファイルやディレクトリをコピーするために使用されます。このメソッドは従来のjava.ioパッケージよりも効率的で柔軟なファイル操作機能を提供します。

メソッドのオーバーロード

Files.copy()メソッドには主に3つのオーバーロード形式があります:

入力ストリームからファイルへのコピー

public static long copy(InputStream in, Path target, CopyOption... options) throws IOException

ファイルから出力ストリームへのコピー

public static long copy(Path source, OutputStream out) throws IOException

ファイルからファイルへのコピー

public static Path copy(Path source, Path target, CopyOption... options) throws IOException

パラメータの詳細

入力パラメータ

  • InputStream in: コピーする入力ストリーム
  • Path source: ソースファイルのパス
  • Path target: ターゲットファイルのパス
  • OutputStream out: 書き込み先の出力ストリーム
  • CopyOption... options: オプションのコピーオプション

CopyOption オプション

よく使用されるCopyOptionものには以下があります:

  • StandardCopyOption.REPLACE_EXISTING: ターゲットファイルが既に存在する場合は、それを置き換えます
  • StandardCopyOption.COPY_ATTRIBUTES: ファイル属性を新しいファイルにコピーします
  • LinkOption.NOFOLLOW_LINKS: シンボリックリンクをたどりません

戻り値

  • ストリームからファイルへのコピーの場合:コピーされたバイト数を返します
  • ファイルからファイルへのコピーの場合:ターゲットファイルのパスを返します
  • ファイルからストリームへのコピーの場合:コピーされたバイト数を返します

使用例

基本的なファイルコピー

サンプル

Path source = Paths.get("source.txt");
Path target = Paths.get("target.txt");

try {
    Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
    System.out.println(文件复制成功);
} catch (IOException e) {
    System.err.println(复制失败: + e.getMessage());
}

属性付きファイルコピー

サンプル

Path source = Paths.get("source.txt");
Path target = Paths.get("target.txt");

try {
    Files.copy(source, target,
               StandardCopyOption.REPLACE_EXISTING,
               StandardCopyOption.COPY_ATTRIBUTES);
    System.out.println(文件及属性复制成功);
} catch (IOException e) {
    System.err.println(复制失败: + e.getMessage());
}

入力ストリームからファイルへのコピー

サンプル

try (InputStream in = new URL("http://example.com/file.txt").openStream()) {
    Path target = Paths.get("downloaded.txt");
    long bytesCopied = Files.copy(in, target);
    System.out.println(ダウンロード完了、コピーしました + bytesCopied + 字节);
} catch (IOException e) {
    System.err.println(下载失败: + e.getMessage());
}

注意事項

  1. ディレクトリのコピー: Files.copy()このメソッドはデフォルトではディレクトリの内容を再帰的にコピーせず、空のディレクトリのみをコピーします
  2. シンボリックリンク: デフォルトではシンボリックリンクをたどります(指定がない限り)LinkOption.NOFOLLOW_LINKS
  3. 原子性: ファイルコピー操作はアトミックではないため、操作中に失敗する可能性があります
  4. パフォーマンス: 大容量ファイルの場合、NIOのコピーは通常、従来のIOよりも効率的です
  5. 例外処理: スローされる可能性のある例外を処理する必要がありますIOException

従来のIOとの比較

特徴 NIO Files.copy() 従来のIO (FileInputStream/FileOutputStream)
パフォーマンス より高い より低い
機能の豊富さ より豊富 基本的
例外処理 より簡潔 より煩雑
シンボリックリンクの処理 サポート サポートしない
ファイル属性のコピー サポート サポートしない

ベストプラクティス

  1. 単純なファイルコピーには、最も基本的なFiles.copy()形式を使用します
  2. ファイル属性を保持する必要がある場合は、COPY_ATTRIBUTESCOPY_ATTRIBUTES オプションを追加します
  3. 既に存在する可能性のあるターゲットファイルを処理する場合は、REPLACE_EXISTING を使用しますREPLACE_EXISTING
  4. 大容量ファイルの場合は、従来のIOメソッドではなくFiles.copy()NIOの使用を検討してください
  5. ストリームリソースの処理には常に try-with-resources を使用してください

Java File Java java.nio.file.Files

その他の拡張