1.Pathクラス

ディスク上のファイルを使って何かを行うプログラムを書きたい場合、それは非常に簡単です。Java には、ファイル自体とその内容の両方を操作するのに役立つクラスが多数あります。

Java の初期バージョンでは、ファイルを操作するためにFileやなどのクラスを使用していました。FileInputStreamただし、このFileクラスは現在非推奨となっており、使用はお勧めできません。もちろん、コード、メソッド パラメーター、またはクラス コンストラクターでこの問題が発生する可能性もあります。

最初から、Pathクラスを使用してファイルを操作する方法を学び始めます。Pathは を置き換えたクラスですFile。より安全で効率的です。

Pathクラス

技術的には、Pathはクラスではなく、インターフェイスです。これは、各オペレーティング システム (およびファイル システム) のクラスの子孫を書き込むことができるようにするために行われますPath

Windows にはファイル パスを記述するための標準が 1 つあり、Linux には別の標準があります。もちろん、世界には他にも多くのオペレーティング システムがあり、それぞれに独自の規格があります。

このため、Pathファイルを操作するメソッドのあらゆる場所でインターフェイスが使用されますが、実際には作業はその子孫クラス、 、 、 ... を通じて行われWindowsPathますUnixPath

Pathオブジェクトの作成

Pathオブジェクト (実際には子孫クラスのオブジェクト)を作成するにはWindowsPath、次のようなステートメントを使用する必要があります。

Path name = Path.of(path);

ここで、nameは変数の名前Path、 はpathファイル (またはディレクトリ) の名前を含むファイル (またはディレクトリ) へのパスです。そしてクラスofの静的メソッドですPath

プログラムが Windows 上で実行されている場合、このof()メソッドはオブジェクトを作成するために使用されます。WindowsPathプログラムが Linux 上で実行されている場合、UnixPathオブジェクトが作成されます。のようなコードを使用してオブジェクトを作成することはできません。Pathnew Path()

例:

コード ノート
Path file = Path.of("c:\\projects\\note.txt");
ファイルへのパス
Path directory = Path.of("c:\\projects\\");
ディレクトリへのパス

有効なオブジェクトが存在するためにファイル (またはディレクトリ) が存在する必要はありませんPath。もしかしたら、単にファイルを作成したいだけかもしれません...Pathオブジェクトは、スープアップされたものに似ていますString。ディスク上の特定のファイルに関連付けられておらず、ディスク上の特定のパスを保存しているだけです。それでおしまい。


2.Pathタイプのメソッド

インターフェースPathには興味深いメソッドが多数あります。最も興味深いものを以下の表に示します。

方法 説明
Path getParent()
親ディレクトリを返します
Path getFileName()
ディレクトリを除いたファイル名を返します
Path getRoot()
パスからルート ディレクトリを返します
boolean isAbsolute()
現在のパスが絶対パスかどうかを確認します
Path toAbsolutePath()
絶対パスに変換します
Path normalize()
ディレクトリ名のワイルドカードを削除します。
Path resolve(Path other)
絶対パスと相対パスから新しい絶対パスを構築します。
Path relativize(Path other)
2 つの絶対パスから相対パスを取得します。
boolean startsWith(Path other)
現在のパスが指定されたパスで始まるかどうかを確認します
boolean endsWith(Path other)
現在のパスが指定されたパスで終わるかどうかを確認します
int getNameCount()
/区切り文字として使用してパスを複数の部分に分割します。
パーツの数を返します。
Path getName(int index)
/区切り文字として使用してパスを複数の部分に分割します。
インデックスに基づいてパーツを返します。
Path subpath(int beginIndex, int endIndex)
/区切り文字として使用してパスを複数の部分に分割します。
指定された間隔に対応するサブパスを返します。
File toFile()
オブジェクトを非推奨オブジェクトPathに変換しますFile
URI toUri()
オブジェクトをオブジェクトPathに変換しますURI

以下に既存の手法を簡単に説明します。


3. パスを部分に分割する

このgetParent()メソッドは、現在のパスの親ディレクトリを指すパスを返します。このパスがディレクトリであるかファイルであるかに関係なく、次のようになります。

コード 価値
String str = "c:\\windows\\projects\\note.txt";
Path path = Path.of(str).getParent();
"c:\\windows\\projects\\"
String str = "c:\\windows\\projects\\";
Path path = Path.of(str).getParent();
"c:\\windows\\"
String str = "c:\\";
Path path = Path.of(str).getParent();
null

このgetFileName()メソッドは、最後の区切り文字の後に続く単一のファイル (またはディレクトリ) 名を返します。

コード 価値
String str = "c:\\windows\\projects\\note.txt";
Path path = Path.of(str).getFileName();
"note.txt"
String str = "c:\\windows\\projects\\";
Path path = Path.of(str).getFileName();
"projects"
String str = "c:\\";
Path path = Path.of(str).getFileName();
null

このgetRoot()メソッドはルート ディレクトリへのパスを返します。

コード 価値
String str = "c:\\windows\\projects\\";
Path path = Path.of(str).getRoot();
"c:\\"


4. 絶対パスと相対パス

パスには絶対パスと相対パスの 2 種類があります。絶対パスはルートディレクトリから始まります。Windows の場合、これはフォルダーになりますc:\。Linux の場合 -/ディレクトリ

相対パスは、あるディレクトリに対して相対的な意味を持ちます。つまり、それは道の終わりのようなものですが、始まりはありません。相対パスを絶対パスに変換したり、その逆を行うことができます。

boolean isAbsolute()方法

このメソッドは、現在のパスが絶対パスかどうかを確認します。

コード 価値
String str = "c:\\windows\\projects\\note.txt";
boolean abs = Path.of(str).isAbsolute();
true
String str = "src\\com\\codegym\\Main.java";
boolean abs = Path.of(str).isAbsolute();
false

Path toAbsolutePath()方法

絶対パスに変換します。必要に応じて、現在の作業ディレクトリを追加します。

コード 価値
String str = "c:\\windows\\projects\\note.txt";
Path path = Path.of(str).toAbsolutePath();
"c:\\windows\\projects\\note.txt"
String str = "src\\com\\codegym\\Main.java";
Path path = Path.of(str).toAbsolutePath();
"d:\\work\\src\\com\\codegym\\Main.java"

Path normalize()方法

パスには、ディレクトリ名の代わりに「..」を記述することができます。これは、1 つ前のディレクトリに戻ることを意味します。正規化によりこれらのことが排除されます。例:

コード 価値
String str = "c:\\windows\\..\\projects\\note.txt";
Path path = Path.of(str).normalize();
"c:\\projects\\note.txt"
String str = "src\\com\\codegym\\..\\Main.java";
Path path = Path.of(str).normalize();
"src\\com\\Main.java"

Path relativize(Path other)方法

このrelativize()メソッドを使用すると、「パス間の差異」、つまりあるパスと別のパスの相対関係を構築できます。

コード 価値
Path path1 = Path.of("c:\\windows\\projects\\note.txt");
Path path2 = Path.of("c:\\windows\\");
Path result = path2.relativize(path1);
"projects\\note.txt"
Path path1 = Path.of("c:\\windows\\projects\\note.txt");
Path path2 = Path.of("c:\\windows\\");
Path result = path1.relativize(path2);
"..\\.."
Path path1 = Path.of("c:\\aaa\\bbb\\1.txt");
Path path2 = Path.of("d:\\zzz\\y.jpg");
Path result = path1.relativize(path2);
IllegalArgumentException:
2 つのパスには異なる「ルート」(異なるディスク)があります。

Path resolve(Path other)方法

このメソッドは、絶対パスと相対パスから新しい絶対パスを構築するのとはresolve()逆のことを行います。relativize()

コード 価値
Path path1 = Path.of("projects\\note.txt");
Path path2 = Path.of("c:\\windows\\");
Path result = path1.resolve(path2);
"c:\\windows"
Path path1 = Path.of("projects\\note.txt");
Path path2 = Path.of("c:\\windows\\");
Path result = path2.resolve(path1);
"c:\\windows\\projects\\note.txt"

toFile()方法

このメソッドは、オブジェクトFileと同じファイル パスを格納する非推奨のオブジェクトを返しますPath

toURI()方法

このメソッドはパスを標準URIに変換し、ファイルへのパスを含むオブジェクトを返します。

ファイルへのパス ファイルへのURI
c:\windows\projects\note.txt
file:///c:/windows/projects/note.txt