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

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

Java SE 7文件操作中的路径操作如何?很多新手对此不是很清楚。为了帮助大家解决这个问题,下面小编就为大家详细讲解一下。需要的人可以从中学习,希望你能有所收获。

Java 7中对Path类有两种操作:对路径的操作和对文件的操作。让我们来看看路径的操作。

创建路径实例

路径实例包含指定文件或目录位置的信息。实例化路径类时,需要指定一个或多个目录或文件名。路径的根目录不是必需的;路径可能只是目录或文件的名称。

创建路径实例最简单的方法是使用路径的get方法(注意有一个类):

path P1=Paths . get('/tmp/foo ');path p2=Paths . get(args[0]);path P3=path . get(' file :///Users/Joe/file test . Java ');

路径类接受字符串或URI作为参数。

获取路径信息

如前所述,文件系统通常是一个树形结构,因此我们可以将路径理解为按顺序存储的一系列名称(目录名和文件名)。目录结构中* *级的目录名为序列中索引为0的目录名,目录结构中* *级的目录名或文件名为序列中索引为n-1的目录名或文件名(其中n为路径中的级数)。Path类提供了通过索引获取序列中的元素或子序列的方法。

我们在以下示例中使用的目录结构如下:

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

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

Java代码

path path=Paths . get(' c : \ \ home \ \ Joe \ \ foo ');//MicrosoftWindowssyntax//path path=path . get('/home/Joe/foo ');//Solarissyntaxsystem . 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(' getname count :% d % n ',path . getname count());System.out.format('子路径(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());

下面是这段代码的输出。

/tr>

上面的代码中我们创建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,说明无法验证该文件是否存在。

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

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/108890.html

(0)

相关推荐

  • 尼德兰,荷兰为什么改国名为尼德兰

    技术尼德兰,荷兰为什么改国名为尼德兰综合国外多家媒体报道,从2020年1月起,荷兰将把国名正式改称为尼德兰,改国名需花费32万美元尼德兰。好好的国名叫了这么多年,现在又花钱又麻烦,为什么非要改呢?(荷兰地图)原来,荷兰的

    生活 2021年10月22日
  • 笔记本电脑风扇声音大怎么办,笔记本电脑风扇声音大怎么办

    技术笔记本电脑风扇声音大怎么办,笔记本电脑风扇声音大怎么办清理电脑的各个通风口,特别是风扇排风口笔记本电脑风扇声音大怎么办。然后拧下螺丝,将电脑主板进行拆除。将风扇取下,清理灰尘即可。可以通过更改系统设置进行降频或者清理

    生活 2021年10月20日
  • mysql big5转 utf-8的转换程式是怎么样的

    技术mysql big5转 utf-8的转换程式是怎么样的今天就跟大家聊聊有关mysql big5转 utf-8的转换程式是怎么样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文

    攻略 2021年11月17日
  • 如何解决Python3.6中PyKeyboard插件无法输入中文字符的问题

    技术如何解决Python3.6中PyKeyboard插件无法输入中文字符的问题本篇文章为大家展示了如何解决Python3.6中PyKeyboard插件无法输入中文字符的问题,内容简明扼要并且容易理解,绝对能使你眼前一亮,

    攻略 2021年12月4日
  • python爬虫的三种写法是什么

    技术python爬虫的三种写法是什么本篇内容介绍了“python爬虫的三种写法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够

    攻略 2021年11月29日
  • java的native使用方法有哪些呢(javanative方法拿什么写的)

    技术Java中的Native方法是什么这期内容当中小编将会给大家带来有关Java中的Native方法是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。以下是java中如何使用nati

    攻略 2021年12月23日