【Java】ファイル操作
Path
宣言
Path
クラスは、ファイルのパスの情報を持つクラスです。
これを使って、後にファイルの操作を行なっていきます。
Path
インスタンスは、Paths
のget()
によって作成します。
引数にはパスそのものを表す文字列か、パスを構成する文字列を指定します。
//以下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 | ファイルの末尾に書き込む |