Filesクラスは、java.nio.fileパッケージの他の主なエントリポイントです。
Java8チュートリアル「File Operations」より引用
このクラスは、ファイルやディレクトリの読み込み、書き込み、操作のための豊富なクラスメソッドを提供します。
Filesメソッドは、Pathオブジェクトのインスタンスで機能します。
Filesクラスの多くは、 java.io.Closeableをimplementsしたストリームオブジェクトの生成を行います。
そのため、try-with-resources構文によって簡潔なリソースの開閉処理が実現できます。
java.nio.file.Filesクラスを利用した場合には、try-with-resources構文で例外処理をして下さい。
Filesクラスのmoveメソッドは、アトミック操作に属します。アトミック操作とは、ファイル、ディレクトリの安全性を保つために、
処理を中断したり、中途半端に失敗したりすることはありません。
他のプロセスと同じファイルやディレクトリ操作が行われた際にファイル、ディレクトリの同一性を保つためです。
そのため、IOExceptionなどの例外が発生した場合には、処理を実行する前の状態になります。
ファイルI / Oメソッドの多くは、メソッド連鎖(Method Chain)の概念をサポートしています。
最初にオブジェクトを返すメソッドを呼び出します。そのオブジェクトのメソッドを即座に呼び出すと、
そのオブジェクトはまだ別のオブジェクトを返します。 I / Oの例の多くは、この手法を使用しています
メソッド連鎖を利用することで、不要な一時変数を定義する必要がなくなり、コンパクトなコードを生成します。
Filesクラスは、インスタンス別のメソッドは存在しません。全てクラスメソッド(static メソッド)です。
Filesクラス自体のインスタンスの生成はせずFiles.クラスメソッド名( 引数 )の形式で利用します。
そして、その引数は一部のクラスメソッドを除き、Pathクラスのインスタンスを引き渡しします。
引数にenum型のLinkOptionを必要とする場合があります、このLinkOptionはシンボリックリンクに対する取扱い
(リンク先の階層を辿るかどうか)を決めるオプションです。
Files.メソッド名( 引数 , 引数N)
メソッドの引数のPathで指定したパスの、存在有無、ディレクトリであるか、ファイルであるか、シンボリックリンクであるか、
ファイル処理を行う前に事前チェックするためのチェック用メソッドです。
戻り値 | メソッド名 | 説明 |
---|---|---|
boolean | exists(Path path, LinkOption... options ) |
指定したパスのディレクトリ又は、 ファイルが存在するかチェックします。 true:存在する。 false:存在しない。 |
boolean | notExists(Path path, LinkOption... options ) |
指定したパスのディレクトリ又は、 ファイルが存在しないかチェックします。 true:存在しない。 false:存在する。 |
boolean | isDirectory(Path path, LinkOption... options ) |
指定したパスがディレクトリかチェックします。 true:ディレクトリ false:ディレクトリではない。 |
boolean | isSameFile( Path path,Path path2 ) |
指定した2つのパスで指定されたファイルが等しいかチェックします。 true:Pathのインスタンスが等しい 又はパスが指定するファイルが等しい。 false:Pathのインスタンスが異なる 又はパスが指定するファイルが異なる。 IOExceptionをthrowする可能性があるので例外処理が必要です。 |
boolean | isSymbolicLink(Path path) |
指定したパスがシンボリックリンクかチェックします。 true:シンボリックリンク false:シンボリックではない。 |
チェックメソッドの実行サンプル
/**
* チェック系メソッドを確認する
*/
public void execCheckMethodSample(){
//このファイルは存在します。
Path path = Paths.get("C:/projects/education/data/input/sample_data.txt");
//このファイルは、sample_data.txtをコピーして名前を変えただけのファイルです。
Path path2 = Paths.get("C:/projects/education/data/input/sample_data2.txt");
System.out.println("path.toString:" + path.toString() );
System.out.println("path2.toString:" + path2.toString() );
System.out.println("Files.exists( path ) is " + Files.exists( path ) );
System.out.println("Files.nonExists( path ) is " + Files.notExists( path ) );
System.out.println("Files.isDirectory( path ) is " + Files.isDirectory( path ) );
try {
System.out.println("Files.isSameFile( path , path2 ) is " + Files.isSameFile( path , path2 ) );
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Files.isSymbolicLink( path ) is " + Files.isSymbolicLink( path ) );
}
実行結果
path.toString:C:¥projects¥education¥data¥input¥sample_data.txt
path2.toString:C:¥projects¥education¥data¥input¥sample_data2.txt
Files.exists( path ) is true
Files.nonExists( path ) is false
Files.isDirectory( path ) is false
Files.isSameFile( path , path2 ) is false
Files.isSymbolicLink( path ) is false
isSampleFile( path , path2 )の結果からファイルのサイズ、内容が一致してもファイル名が異なるのでfalseを返します。
これをファイル名を一致させ、ディレクトリ階層だけ変えてもfalseを返します。
OSのファイルシステムでは、同一のディレクトリ階層に同一ファイルは、存在できません。
即ちこのメソッドは、Pathインスタンスが示すパス名またはインスタンスが一致するかというメソッドになります。