Java 7におけるこれらの新しい特性-2(ファイルパス編)
もっと読む
Java 7では、ファイル管理に多くの新しいAPIが提供されています。これらの新しいインターフェースは、ファイルやフォルダを操作するのに便利です。それらはほとんどjava.nio.fileの下にあります。 java.nio.file.Pathsは、Pathオブジェクトを作成するための静的方法 を含む。 java.nio.file.Pathは、ファイルパスを操作するための多くの方法 を含む。 java.nio.file.FileSystemsファイルシステムにアクセスするためのクラス java.nio.file.FileSystemは、Unixのルートディレクトリ/を表していますが、Windowsの下では、Cディスク です。 java.nio.file.FileStoreは、本当の記憶装置を表し、デバイスの詳細情報 を提供しています。 java.nio.file.atribute.FileStore AttributeViewは、アクセスファイルの情報 を提供しています。
一つのパスは、一つのファイルまたはフォルダの特定の位置を決定することができます。Java 7では、Pathオブジェクトでファイルまたはフォルダに対する操作を実行します。Pathオブジェクトを得る方法は多くあります。主に次の2つがあります。 FileSystemオブジェクトを使用したgetPath方法 Pathオブジェクトのget方法を使用する まずgetPath法を見てみます。例示的なコードは以下の通りです。
Pathsクラスのget方法を使って同じPathオブジェクトを得ることができます。JDKのソースコードを調べたら、その実現方法はFileSystemと同じです。
Java 7では、ファイル管理に多くの新しいAPIが提供されています。これらの新しいインターフェースは、ファイルやフォルダを操作するのに便利です。それらはほとんどjava.nio.fileの下にあります。
一つのパスは、一つのファイルまたはフォルダの特定の位置を決定することができます。Java 7では、Pathオブジェクトでファイルまたはフォルダに対する操作を実行します。Pathオブジェクトを得る方法は多くあります。主に次の2つがあります。
public static void main(String[] args) {
Path path = FileSystems.getDefault().getPath("/Home/projects/node.txt");
System.out.println();
System.out.println("toString: " + path.toString());
System.out.printf("getFileName: %s
", path.getFileName());
System.out.printf("getRoot: %s
", path.getRoot());
System.out.printf("getNameCount: %d
", path.getNameCount());
for (int index = 0; index < path.getNameCount(); index++) {
System.out.printf("getName(%d): %s
", index, path.getName(index));
}
System.out.printf("subpath(0,2): %s
", path.subpath(0, 2));
System.out.printf("getParent: %s
", path.getParent());
System.out.println(path.isAbsolute());
try {
path = Paths.get("Home", "projects", "users.txt");
System.out.printf("Absolute path: %s", path.toAbsolutePath());
} catch (InvalidPathException ex) {
System.out.printf("Bad path: [%s] at position %s", ex.getInput(), ex.getIndex());
}
}
例では、FileSystemsのget Default方法は、現在のファイルシステムを表すFileSystemオブジェクトにJVMから戻り、FileSystemを通じてPathオブジェクトを得ることができます。一つのPathは複数のサブPathからなり、サブPathはsubpath法を通用させて得ることができる。Pathsクラスのget方法を使って同じPathオブジェクトを得ることができます。JDKのソースコードを調べたら、その実現方法はFileSystemと同じです。
public static Path get(String first, String... more) {
return FileSystems.getDefault().getPath(first, more);
}
私たちが使用しているシステムに大量のJava 7の前にファイルに対して動作するコードがある場合、例えば多くのFileクラスを使用すれば、Java 7においてFileクラスに対して追加されたtoPath方法によって一つのFileをPathに変換することができます。public static void main(String[] args) {
try {
Path path = Paths.get(new URI("file:///C:/home/docs/users.txt"));
File file = new File("C:\\home\\docs\\users.txt");
Path toPath = file.toPath();
System.out.println(toPath.equals(path));
} catch (URISyntaxException e) {
System.out.println("Bad URI");
}
}
相対パスを絶対パスに変換するには、PathクラスのtoAbsoluutePath方法を呼び出す必要があります。また、システムのパスセパレータを取得するためには、FileSystemもget Separator方法を提供している。 public static void main(String[] args) {
String separator = FileSystems.getDefault().getSeparator();
System.out.println("The separator is " + separator);
try {
Path path = Paths.get(new URI("file:///D:/Home/projects/node.txt"));
System.out.println("subpath: " + path.subpath(0, 3));
path = Paths.get("/home", "docs", "users.txt");
System.out.println("Absolute path: " + path.toAbsolutePath());
System.out.println("URI: " + path.toUri());
} catch (URISyntaxException ex) {
System.out.println("Bad URI");
} catch (InvalidPathException ex) {
System.out.println("Bad path: [" + ex.getInput() + "] at position " + ex.getIndex());
}
}
ファイルが本当に存在するかどうかを判断し、パラメータとしてPathオブジェクトを受信するexists方法をFilesクラスに提供します。Path path = Paths.get(new URI("file:///C:/home/docs/bogusfile.txt"));
System.out.println("File exists: " + Files.exists(path));
パス記述子に「.」または「.」の文字がある場合、これらの記述子は、Pathのnormalize方法を呼び出して真のパスに変換することができます。下のコードを実行してください。現在のパスを表していますので、「.」は削除されました。"."は上のパスで代替されます。 public static void main(String[] args) {
Path path = Paths.get("D:/home/docs/../music/Space Machine A.mp3");
System.out.println("Absolute path: " + path.toAbsolutePath());
System.out.println("URI: " + path.toUri());
System.out.println("Normalized Path: " + path.normalize());
System.out.println("Normalized URI: " + path.normalize().toUri());
System.out.println();
path = Paths.get("D:/home/./music/ Robot Brain A.mp3");
System.out.println("Absolute path: " + path.toAbsolutePath());
System.out.println("URI: " + path.toUri());
System.out.println("Normalized Path: " + path.normalize());
System.out.println("Normalized URI: " + path.normalize().toUri());
}
PathのtoRealPathは、本当にファイルを表すパスを返します。指定されたファイルが存在しない場合、NoSuchFileExceptionは例外的にスローされます。torealPathはLinkOption.NOFOLLOWに入ることができます。LINKSパラメータは、結果をリンクされた経路で表示します。Filesはファイルが存在するかどうかを判断する方法でもこのパラメータを加えることができます。以下の例ではmusicフォルダの下のusersはdocsファイルの下でusersファイルのリンクです。 public static void main(String[] args) {
Path path1 = null;
Path path2 = null;
path1 = Paths.get("/home/docs/users.txt");
path2 = Paths.get("/home/music/users.txt");
System.out.println(Files.isSymbolicLink(path1));
System.out.println(Files.isSymbolicLink(path2));
try {
Path path = Paths.get("C:/home/./music/users.txt");
System.out.println("Normalized: " + path.normalize());
System.out.println("Absolute path: " + path.toAbsolutePath());
System.out.println("URI: " + path.toUri());
System.out.println("toRealPath (Do not follow links): " + path.toRealPath(LinkOption.NOFOLLOW_LINKS));
System.out.println("toRealPath: " + path.toRealPath());
Path firstPath = Paths.get("/home/music/users.txt");
Path secondPath = Paths.get("/docs/status.txt");
System.out.println("From firstPath to secondPath: " + firstPath.relativize(secondPath));
System.out.println("From secondPath to firstPath: " + secondPath.relativize(firstPath));
System.out.println("exists (Do not follow links): " + Files.exists(firstPath, LinkOption.NOFOLLOW_LINKS));
System.out.println("exists: " + Files.exists(firstPath));
System.out.println("notExists (Do not follow links): " + Files.notExists(firstPath, LinkOption.NOFOLLOW_LINKS));
System.out.println("notExists: " + Files.notExists(firstPath));
} catch (IOException ex) {
Logger.getLogger(SymbolicLinkExample.class.getName()).log(Level.SEVERE, null, ex);
}
}
Java 7で新しく引用されたこれらの種類は確かに大きく簡略化されています。操作ファイルはもうそんなに複雑ではないようにします。今後はどのように修正し、コピーし、ファイルを削除するかをさらに調べます。