千家信息网

Java SE 7文件操作中的路径操作是怎样的

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,Java SE 7文件操作中的路径操作是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java SE 7中对Pat
千家信息网最后更新 2025年01月20日Java SE 7文件操作中的路径操作是怎样的

Java SE 7文件操作中的路径操作是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

Java SE 7中对Path类的操作主要有两种:对路径的操作和对文件的操作。我们就来了解一下对路径的操作。

创建Path实例
Path实例包含了指定文件或目录位置的信息,在实例化Path类时,需要指定一个或多个目录或文件名。路径的根目录不是必须的;路径信息可能仅仅是一个目录或文件的名称。
最简单的创建Path实例的方式就是使用Paths(注意这里有一个s)类的get方法:

Path p1 = Paths.get("/tmp/foo");     Path p2 = Paths.get(args[0]);     Path p3 = Paths.get("file:///Users/joe/FileTest.java");



Path类接受String或URI作为参数。

获取路径信息
前面我们已经说过了,File System一般是树形结构,因此我们可以把Path理解为按顺序存储的一系列的名称(目录名称和文件名称)。目录结构中***一层的目录名就是序列中 index为0的那一个,目录结构中***一层的目录名或者文件名就是序列中index为n-1的那一个(这里n是路径中层次的数目)。Path类提供方法来通过index获取序列中的一个元素或一个子序列。
随后的例子中我们使用的目录结构如下图:

下面的代码定义了一个Path对象并获取其中的信息。要注意的是这些代码中除了isHidden方法外,其他的方法并不需要指定的目录或文件存在;如果不存在,isHidden方法会抛出异常。

Java代码

Path path = Paths.get("C:\\home\\joe\\foo");    // Microsoft Windows syntax     //Path path = Paths.get("/home/joe/foo");    // Solaris syntax     System.out.format("toString: %s%n", path.toString());     System.out.format("getName: %s%n", path.getName());     System.out.format("getName(0): %s%n", path.getName(0));     System.out.format("getNameCount: %d%n", path.getNameCount());     System.out.format("subpath(0,2): %d%n", path.subpath(0,2));     System.out.format("getParent: %s%n", path.getParent());     System.out.format("getRoot: %s%n", path.getRoot());     System.out.format("isHidden: %s%n", path.isHidden());


下面是这段代码的输出情况



上面的代码中我们创建Path时使用的是绝对路径,下面我们来看看创建路径时使用相对路径时,这段代码的执行结果:

Java代码

//Path path = Paths.get("sally/bar");     // Solaris syntax     Path path = Paths.get("sally\\bar");    // Microsoft Windows syntax


大家可以自行去实验一下具体的输出是什么。

去除Path中的冗余
在很多文件系统中我们使用'.'来代表当前目录,使用'..'代表父目录。在有些情况下我们创建的路径中会有冗余的路径信息,例如:
/home/./joe/foo
/home/sally/../joe/foo
方法normalize会去除这些冗余信息,包括'.'或'directory/..'。上面的两个例子在去除冗余信息后都是/home/joe/foo。
要注意的是normalize方法并不去检查文件系统,它只是简单的进行语法操作。在第二个例子中,如果sally是一个指向其他的目录的符号链接,那么去除了sally/..后可能导致Path不在指向原来的文件或目录。
如果你需要清除冗余信息,又要保证结果仍然指向正确的文件或目录,可以使用toRealPath方法。在下面我们会讲到这个方法。

转换Path
有3个方法用来转换Path。
* toUri方法
如果你需要将Path转换为可以在浏览器中打开的字符串格式,可以使用toUri方法,例如:

Java代码

Path p1 = Paths.get("/home/logfile");     System.out.format("%s%n", p1.toUri());  // 结果是 file:///home/logfile


注意在这里即使/home/logfile'指向的目录或文件不存在,这段代码同样能够执行成功。
* toAbsolutePath方法
该方法将路径转换为绝对路径。如果原来的Path已经是绝对路径,该方法直接返回原有的Path对象。
我们来看看下面的例子:

Java代码

Path path = Paths.get("home\\joe\\foo");     Path absolutePath = path.toAbsolutePath();     System.out.println(path == absolutePath); //结果是false         Path path3 = Paths.get("c:\\home\\joe\\foo ");     Path absolutePath3 = path3.toAbsolutePath();     System.out.println(path3 == absolutePath3);//结果是true


同样的,toAbsolutePath方法并不需要Path所指向的文件或目录存在。
* toRealPath方法
这个方法会返回一个已经存在的文件或目录的真实路径(如果文件或目录不存在或无法访问,该方法会抛出异常)。该方法会执行以下的操作:
如果传入的参数是true并且文件系统支持符号链接,则解析路径中存在的符号链接(如果有的话)。
如果原来的Path是相对路径,将其转换成绝对路径。
如果路径中含有冗余信息,返回的Path中这些冗余信息会被去除。


连接两个Path
可以使用resolve方法来将两个Path连接起来。该方法的参数是一个字符串。如果该字符串代表的是一个相对路径,那么这个路径会被扩展到原来的路径后。如果传入的字符串是一个绝对路径,那么返回的值就是传入的这个绝对路径。例如:

Java代码

Path p1 = Paths.get("C:\\home\\joe\\foo");        System.out.format("%s%n", p1.resolve("bar")); // 结果是 C:\home\joe\foo\bar         Paths.get("foo").resolve("c:\\home\joe");       // 结果是  C:\home\joe


创建两个路径之间的路径
这个功能说起来有些绕口,实际的功能就是创建两个指定的目录或文件之间的相对路径。例如:

Java代码

Path p1 = Paths.get("joe/foo");     Path p2 = Paths.get("sally");


在这个例子中,由于两个路径都是相对路径,没有其他的信息,我们会认为这两个joe和sally是同一级的兄弟目录,因此有以下的结果

Java代码

Path p1_to_p2 = p1.relativize(p2);   // 结果是 ../../sally     Path p2_to_p1 = p2.relativize(p1);   // 结果是 ../joe/foo


让我们看看另外一个例子:

Java代码

Path p1 = Paths.get("home");     Path p3 = Paths.get("home/sally/bar");     Path p1_to_p3 = p1.relativize(p3);  // 结果是 sally/bar     Path p3_to_p1 = p3.relativize(p1);  // 结果是 ../..


在这个例子中,两个路径共享同一个节点-home,所以结果并不是../home/sally/bar和../../../home.
如果两个路径中有一个是绝对路径,另外一个是相对路径,relative方法会抛出异常。如果两个路径都是绝对路径,那么relative方法的行为和系统相关,不同的系统可能不同。
我在Windows操作系统下实验了一下,如果两个路径属于同一个硬盘,那么可以执行成功,否则会抛出异常。

Java代码

Path path2 = Paths.get("c:\\abcd\\efg");     Path path3 = Paths.get("c:\\temp");     System.out.println(path2.relativize(path3));        //结果是..\..\temp     System.out.println(path3.relativize(path2));        //结果是..\abcd\efg         Path path4 = Paths.get("c:\\abcd\\efg");     Path path5 = Paths.get("d:\\temp");     System.out.println(path4.relativize(path5));        //抛出异常


Path的比较
Path提供equals方法来检查两个Path是否相等。但是这里要注意的是比较的并不是两个Path是否指向同一个目录或者文件。请看下面的例子:

Java代码

Path path2 = Paths.get("abcd\\123");     Path path3 = Paths.get("abcd\\123");     Path path4 = Paths.get("abcd\\.\\123");     System.out.println(path2.equals(path3));        //true     System.out.println(path2.equals(path4));        //false     System.out.println(path2.equals(path4.normalize())); //true     System.out.println(path2.equals(path2.toAbsolutePath()));        //false


Path类还提供了startsWith和endsWith方法,这两个方法用来检查路径是否以指定的字符串开始或者结束,例如:

Java代码

Path path = ...;     Path otherPath = ...;     Path beginning = Paths.get("/home");     Path ending = Paths.get("foo");         if (path.equals(otherPath)) {         //equality logic here     } else if (path.startsWith(beginning)) {         //path begins with "/home"     } else if (path.endsWith(ending)) {         //path ends with "foo"     }


Path类实现了Iterable接口,iterator方法会返回一个Iterator对象,该对象中的***个元素就是原路径中最上层(最靠近根节点)的目录。下面是使用这个方法的例子:

Java代码

Path path = ...;     for (Path name: path) {         System.out.println(name);     }


Path类还实现了Comparable接口,因此可以使用compareTo来比较两个Path。比较的算法和结果是和文件系统的提供者和系统平台相关的。大家在使用之前,***先实验一下。
Path 类还提供了一个方法isSameFile来检查两个Path是否指向同一个目录或文件。如果作为参数的Path为null,那么会直接返回false,不会去检查Path指向的文件是否存在。如果两Path来自不同的文件系统提供者,那么也会直接返回false,不会去检查文件或目录是否存在。如果两个 Path执行equals方法的返回结果为true,那么这个方法直接返回true,也不会去检查文件或目录是否存在。其他的情况下是否会去打开或访问 Path指向的文件或目录是与具体的实现相关的,也就是说不同的JDK/JRE可能会有不同的行为。
验证文件或目录是否存在
上面所介绍的很多方法都不会去验证Path指向的文件或目录是否存在,只是操作Path实例自身。但是在有些情况下,你需要访问文件系统来验证文件、目录存在与否,这时你可以使用exists和notExists方法。需要注意的是!path.exists()并不等于path.notExists()。当你调用这两个方法时,有以下3中情况:

* 文件或者目录被证实存在
* 文件或者目录被证实不存在
* 不知道文件或目录是否存在。当程序没有访问这个文件或目录的权限的时候这个情况会发生。
如果exists()和notExists()都返回false,说明无法验证该文件是否存在。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

路径 文件 方法 目录 两个 代码 结果 信息 指向 系统 例子 冗余 检查 就是 情况 不同 字符 字符串 实例 面的 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 如何开发一个移动服务器 中国优秀硕士论文数据库 镜像服务器代理服务器的区别 落实 网络安全法 总结 阿里云mc服务器 安全组 威纶通配方数据库建不了 软件开发人员证书 计算机网络技术基础答案周舸 软件开发有没有国家二级 网络安全手抄抄报图片 服务器带内和带外管理 2018网络安全人才现状白皮书 集创北方软件开发 软件开发公司年终绩效考核 自建拨号上网服务器 怎么制作一个软件开发 计算机三级网络技术应用 天津pdu服务器电源厂家电话 梦幻西游手游突然无法访问服务器 饥荒如何转让服务器 服务器销售怎么备案 数据库怎么导入mysql 数据库工程师课程 周村工资管理oa软件开发公司 学习软件开发就业前景介绍 数据库字典中的位数是什么意思 服务器安全狗卸载影响系统 校园网络安全研究方案 avast网络安全版下载 计算机网络技术要考那些正
0