java.svg

【Java】ファイル操作

Java

Path

宣言

Pathクラスは、ファイルのパスの情報を持つクラスです。 これを使って、後にファイルの操作を行なっていきます。

Pathインスタンスは、Pathsget()によって作成します。 引数にはパスそのものを表す文字列か、パスを構成する文字列を指定します。

//以下2つは同じパスを表す
Path path1 = Paths.get("C:\\hoge\\fuga.txt");
Path path2 = Paths.get("C:", "hoge", "fuga.txt");

絶対パスと相対パス

Pathには、相対パスを絶対パスに変換するtoAbsolutePath()というメソッドがあります。

Path path1 = Paths.get("fuga.txt");
Path path2 = path1.toAbsolutePath(); // C:\\hoge\\fuga.txt

これを利用することでカレントフォルダを取得することができます。

Path currentDir = Paths.get("").toAbsolutePath();

また、パスが絶対パスであることを判定するisAbsolutePath()というメソッドがあります。

Path path1 = Paths.get("fuga.txt");
path1.isAbsolutePath();  // false

Path path2 = Paths.get("C:\\hoge\\fuga.txt");
path2.isAbsolutePath(); // true

Files

Filesクラスは、Pathを使用して以下のファイル操作を行うためのクラスになります。

フォルダの作成

フォルダの作成は、createDirectory()を使用します。 フォルダが既に存在している場合は、FileAlreadyExistsExceptionがスローされます。 また途中の構成要素(フォルダ)が存在しない場合は、NoSuchFileExceptionがスローされます。

Path path = Paths.get("C:\\hoge\\fuga");
try {
  Files.createDirectory(path);
} catch (IOException e) {
  e.printStackTrace();
}

フォルダの作成にはもう 1 つ、createDirectories()というメソッドがあります。 これは途中の構成要素を含め、フォルダが存在しない場合に作成します。

Path path = Paths.get("C:\\hoge\\fuga\\piyo");
try {
  Files.createDirectories(path);
} catch (IOException e) {
  e.printStackTrace();
}

C:\\hogeまでフォルダがある場合、\\fuga\\piyoが作成されます。 \\piyoが作成された状態で実行しても、例外はスローされません。

ファイルの作成

ファイルの作成は、createFile()を使用します。 フォルダ作成時同様、ファイルが存在している場合や途中の構成要素が存在しない場合は、例外がスローされます。

Path path = Paths.get("C:\\hoge\\fuga.txt");
try {
  Files.createFile(path);
} catch (IOException e) {
  e.printStackTrace();
}

ファイルの複製

ファイルのコピーは、copy()を使用します。 コピー元のファイルとコピー先のファイルをPathで指定します。

Path origin = Paths.get("C:\\hoge\\fuga.txt");
Path target = Paths.get("C:\\hoge\\piyo.txt");
try {
  Files.copy(origin, target, StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {
  e.printStackTrace();
}

コピーの際に、オプションとして以下のStandardCopyOptionを指定できます。

オプション説明
ATOMIC_MOVE原始的なファイル・システム操作としてファイルを移動
COPY_ATTRIBUTES属性を新しいファイルにコピー
REPLACE_EXISTINGファイルが存在する場合は既存のファイルを置換

ファイルの移動

ファイルの移動は、move()を使用します。 copy()同様、移動元、移動先のPathを指定し、さらにStandardCopyOptionを指定できます。

Path origin = Paths.get("C:\\hoge\\fuga.txt");
Path target = Paths.get("C:\\hoge\\piyo.txt");
try {
  Files.move(origin, target, StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {
  e.printStackTrace();
}

同じフォルダに移動する場合は、結果的にファイル名の変更となります。

ファイルの削除

ファイルの削除は、delete()を使用します。 ファイルが存在しない場合は、NoSuchFileExceptionがスローされます。

Path path = Paths.get("C:\\hoge\\fuga.txt");
try {
  Files.delete(path);
} catch (IOException e) {
  e.printStackTrace();
}

ファイルの削除にはもう 1 つ、deleteIfExists()というメソッドがあります。 これは、ファイルが存在する場合に削除の処理を行います。 よって、NoSuchFileExceptionはスローされなくなります。

Path path = Paths.get("C:\\hoge\\fuga.txt");
try {
  Files.deleteIfExists(path);
} catch (IOException e) {
  e.printStackTrace();
}

ファイルの存在

ファイルが存在するかを検査するには、exists()を使用します。

Path path = Paths.get("C:\\hoge\\fuga.txt");
Files.exists(path);

逆に、notExists()によってファイルが存在しないことを検査します。

Path path = Paths.get("C:\\hoge\\piyo.txt");
Files.notExists(path);

ファイルの読み込み

ファイルの読み込みは、readAllBytes()によってbytes[]で読み込むか、readAllLines()によってList<String>で読み込むかがあります。

Path path = Paths.get("C:\\hoge\\fuga.txt");
try {
  byte[] bytes = Files.readAllBytes(path);
  List<String> lines = Files.readAllLines(path);
} catch (IOException e) {
  e.printStackTrace();
}

ファイルの書き込み

ファイルの書き込みは、write()を使用します。 書き込みの情報は、bytes[]か``List`で指定します。

Path in = Paths.get("C:\\hoge\\fuga.txt");
Path out1 = Paths.get("C:\\hoge\\piyo1.txt");
Path out2 = Paths.get("C:\\hoge\\piyo2.txt");
try {
  byte[] bytes = Files.readAllBytes(path);
  List<String> lines = Files.readAllLines(path);

  Files.write(out1, bytes, StandardOpenOption.CREATE);
  Files.write(out2, lines, StandardOpenOption.WRITE, StandardOpenOption.APPEND);
} catch (IOException e) {
  e.printStackTrace();
}

書き込みの際、オプションとして以下のStandardOpenOptionを指定できます。 オプションを指定しない場合は、ファイルの内容が上書きされます。

オプション説明
CREATEファイルが存在しない場合は新しいファイルを作成
CREATE_NEW新しいファイルを作成するが、ファイルが存在する場合はエラー
APPENDファイルの末尾に書き込む