1.Path

如果您想编写一个程序来处理磁盘上的文件,那很容易。Java 有很多类可以帮助您处理文件本身及其内容。

Java 的早期版本使用File和之类的类FileInputStream来处理文件。但是,该类File现已弃用,不建议使用。当然,你可能仍然会在代码、方法参数或类构造函数中遇到它。

从一开始,我们将开始学习如何使用该类处理文件PathPath是替换的类File。它更安全、更高效。

Path班级

从技术上讲,Path它不是一个类——它是一个接口。Path这样做是为了允许为每个操作系统(和文件系统)编写类的后代。

Windows 有一个写入文件路径的标准,而 Linux 有另一个。当然,世界上还有很多其他的操作系统,每个都有自己的标准。

这就是为什么Path在处理文件的方法中到处都使用接口的原因,尽管实际上工作是通过其后代类进行的:WindowsPath, UnixPath, ...

创建Path对象

要创建一个Path对象(实际上是WindowsPath子类的对象),您需要使用如下语句:

Path name = Path.of(path);

其中name是变量的名称Pathpath是文件(或目录)的路径,包括文件(或目录)的名称。并且of是类的静态方法Path

如果程序在 Windows 上运行,则该of()方法用于创建对象。WindowsPath如果程序在 Linux 上运行,则UnixPath创建对象。您不能使用Path像.new Path()

例子:

代码 笔记
Path file = Path.of("c:\\projects\\note.txt");
文件路径
Path directory = Path.of("c:\\projects\\");
目录路径

文件(或目录)不需要存在才能使有效Path对象存在。也许你只是想创建一个文件......一个Path对象就像一个加强版String:它没有绑定到磁盘上的特定文件——它只是在磁盘上存储一个特定的路径。就是这样。


Path2.类型的方法

Path接口有很多有趣的方法。下表列出了最有趣的一些。

方法 描述
Path getParent()
返回父目录
Path getFileName()
返回没有目录的文件名
Path getRoot()
从路径返回根目录
boolean isAbsolute()
检查当前路径是否是绝对路径
Path toAbsolutePath()
将路径转换为绝对路径
Path normalize()
删除目录名称中的通配符。
Path resolve(Path other)
从绝对路径和相对路径构造一个新的绝对路径。
Path relativize(Path other)
从两个绝对路径中获取一个相对路径。
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.绝对路径和相对路径

有两种类型的路径:绝对路径和相对路径。绝对路径从根目录开始。对于 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()方法

在路径中,可以不用目录名,而写“..”,意思是返回一个目录。规范化消除了这些东西。例子:

代码 价值
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);
非法参数异常:
这两条路径有不同的“根”(不同的磁盘)

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