ファイルやディレクトリを移動する(Files.move)

Files クラスで用意されている move メソッドを使用することで、指定したファイルやディレクトリを移動することができます。同じディレクトリ内の移動の場合はファイル名の変更と同じ結果になります。ここでは Java を使ってファイルを移動する方法について解説します。

※ 移動ではなくコピーする場合は「ファイルやディレクトリをコピーする(Files.copy)」を参照してください。

(Last modified: )

ファイルを移動する

ファイルを移動するには Files クラスで用意されている move メソッドを使用します。 move メソッドはクラスメソッドです。書式は次のとおりです。

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

パラメータ:
source - 移動するファイルへのパス
target - ターゲット・ファイルへのパス(ソース・パスとは異なるプロバイダに関連付けられている場合がある)
options - 移動をどのように実行するべきかを指定するオプション

戻り値:
ターゲット・ファイルへのパス

例外:
UnsupportedOperationException - サポートされないコピー・オプションが配列に含まれる場合
FileAlreadyExistsException - ターゲット・ファイルは存在するけれども、REPLACE_EXISTINGオプションが指定されていないために置換できない場合(オプションの固有例外)
DirectoryNotEmptyException - REPLACE_EXISTINGオプションが指定されていますが、空ではないディレクトリであるためファイルを置換できません。または、(optional specific exceptions)を移動する必要があるエントリを含む空ではないディレクトリです
AtomicMoveNotSupportedException - オプション配列にATOMIC_MOVEオプションを含まれるけれども、原子的なファイル・システム操作としてファイルを移動できない場合
IOException - 入出力エラーが発生した場合
SecurityException - デフォルト・プロバイダで、セキュリティ・マネージャがインストールされている場合は、checkWriteメソッドが呼び出されてソースおよびターゲット・ファイルの両方への書込みアクセスがチェックされます

1 番目の引数に移動元のファイルを表す Path オブジェクトを指定します。 2 番目の引数に移動先のファイルを表す Path オブジェクトを指定します。省略可能な 3 番目の引数については後ほど解説します。

※ Path オブジェクトを使ってファイルやディレクトリを表す方法については「Pathオブジェクトを使ってファイルやディレクトリを表す」を参照されてください。

基本的な使い方は次のようになります。最初にファイルを移動する場合です。

Path p1 = Paths.get("src/file1.txt");
Path p2 = Paths.get("dest/file2.txt");

try{
  Files.move(p1, p2);
}catch(IOException e){
  System.out.println(e);
}

カレントディレクトリの下にある src ディレクトリの中の file1.txt ファイルを、カレントディレクトリの下の dest ディレクトリの中に移動し file2.txt という名前に変更します。

この時、移動先のファイルが既に存在していた場合は java.nio.file.FileAlreadyExistsException 例外が発生します。コピー先のファイル名と名前の同じディレクトリが存在していた場合も同じです。

次にディレクトリの移動を行う場合です。

Path p1 = Paths.get("src");
Path p2 = Paths.get("dest");

try{
  Files.move(p1, p2);
}catch(IOException e){
  System.out.println(e);
}

ディレクトリを移動元として指定した場合、移動先に指定したディレクトリが作成されます。移動元のディレクトリが空ではなかった場合、移動元のディレクトリに格納されていたファイルやサブディレクトリ(およびサブディレクトリに格納されているファイルなど)は移動先のディレクトリの中に移動します。

この時、移動先のディレクトリが既に存在している場合は java.nio.file.FileAlreadyExistsException 例外が発生します。移動先のディレクトリ名と同じ名前のファイルが存在していた場合も同じです。

サンプルコード

それでは簡単なサンプルプログラムを作って試してみます。テキストエディタで次のように記述したあと、 JSample12-1.java という名前で保存します。

import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.Files;
import java.io.IOException;

class JSample12_1{
  public static void main(String[] args){
    Path p1 = Paths.get("C:/code/java/file/doc/memo.txt");
    Path p2 = Paths.get("C:/code/java/file/doc/memo.back");
    Path p3 = Paths.get("C:/code/java/file/doc/src");
    Path p4 = Paths.get("C:/code/java/file/doc/dest");

    try{
      Files.move(p1, p2);
      Files.move(p3, p4);
    }catch(IOException e){
      System.out.println(e);
    }
  }
}

プログラムの実行前、 C:\code\java\file\doc ディレクトリの中には次のように memo.txt ファイルと src ディレクトリおよび back ディレクトリが作成されていました。

ファイルをコピーする(1)

src ディレクトリの中には report.doc ファイルが作成されています。

ファイルをコピーする(2)

コンパイルを行います。

javac -encoding UTF-8 JSample12_1.java

その後で、次のように実行してください。

java JSample12_1

ファイルをコピーする(3)

ファイルおよびディレクトリが移動しました。あらためて C:\code\java\file\doc ディレクトリの中を確認してみると、 memo.txt が移動して doc ディレクトリの中には存在せず back ディレクトリの中に memo.back として作成されています。

ファイルをコピーする(4)

ファイルをコピーする(5)

また src ディレクトリが移動して doc ディレクトリの中には存在せず、移動先の dest ディレクトリが作成されています。 dest ディレクトリの中には src ディレクトリの中にあった report.doc が格納されています。

ファイルをコピーする(6)

ファイルをコピーする(7)

なお例えば back ディレクトリの中に memo.back が格納されている状態で、再度 memo.txt を back\memo.back へ移動しようとすると例外が発生します。

ファイルをコピーする(8)

REPLACE_EXISTINGオプションを付けて移動する

move メソッドを実行するときに、 3 番目の引数に REPLACE_EXISTING を設定すると、移動先のファイルが既に存在していた場合に例外を発生させるのではなく移動元のファイルで移動先のファイルを置き換えます。

具体的には次のように記述します。

Path p1 = Paths.get("src/file1.txt");
Path p2 = Paths.get("dest/file2.txt");

try{
  Files.move(p1, p2, REPLACE_EXISTING);
}catch(IOException e){
  System.out.println(e);
}

※ import static java.nio.file.StandardCopyOption.REPLACE_EXISTING; が必要です。

REPLACE_EXISTING オプションを指定した場合、移動先である dest\file2.txt ファイルが既に存在していた場合、移動元である src\file1.txt ファイルで置き換えられます。

この時、移動先に指定したファイル名と同じディレクトリが存在した場合、ディレクトリを移動元である src\file1.txt ファイルで置き換えられます。ただしディレクトリが空ではなくディレクトリの中に何らかのファイルが格納されている場合には java.nio.file.DirectoryNotEmptyException 例外が発生します。

サンプルコード

それでは簡単なサンプルプログラムを作って試してみます。テキストエディタで次のように記述したあと、 JSample11-2.java という名前で保存します。

import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.Files;
import java.io.IOException;
import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;

class JSample11_1{
  public static void main(String[] args){
    Path p1 = Paths.get("C:/code/java/file/doc/memo.txt");
    Path p2 = Paths.get("C:/code/java/file/doc/memo.back");

    try{
      Files.copy(p1, p2, REPLACE_EXISTING);
    }catch(IOException e){
      System.out.println(e);
    }
  }
}

プログラムの実行前、 C:\code\java\file\doc ディレクトリの中には次のように memo.txt ファイルと memo.back ファイルが作成されていました。

REPLACE_EXISTINGオプションを付けて移動する(1)

コンパイルを行います。

javac -encoding UTF-8 JSample12_2.java

その後で、次のように実行してください。

java JSample12_2

REPLACE_EXISTINGオプションを付けて移動する(2)

今回移動先のファイルとして指定した memo.back ファイルは既に存在していましたが、プログラムを実行しても例外は発生せずに移動元の memo.txt ファイルで memo.back が置き換えられました。

REPLACE_EXISTINGオプションを付けて移動する(3)

-- --

Java を使ってファイルを移動する方法について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。