一旦确认了文件系统上的一个文件或目录,那么就可以定义一个 Path 类来指向它。定义 Path 类可以使用绝对路径、相对路径、路径中带有一个点号“.”(表示当前目录)、路径中带有两个点“..”(表示上一层目录)等。定义 Path 类最简单的方法是调用辅助类 Paths 的 get() 方法。下面将介绍使用不同的方式来得到 C:\rafaelnadal\tournaments\2009\BNP.txt 文件的 Path 对象。

定义绝对路径

绝对路径(有时也成为全路径)是指包含了根目录以及所有子目录以及文件名的文件路径。在 NIO.2 中定义绝对路径只需要一行代码,下面的例子定义了 C:\rafaelnadal\tournaments\2009 目录下的 BNP.txt 文件(测试的时候,这个文件有可能不存在):

Path path = Paths.get("C:/rafaelnadal/tournaments/2009/BNP.txt");
1
Path path=Paths.get("C:/rafaelnadal/tournaments/2009/BNP.txt");

get() 方法也支持将文件路径分块。NIO 将会自动重建文件路径。如果你将文件路径分块,那么你就不用再考虑文件路径分隔符。前面的绝对路径例子中的路径可以被分块改写为:

Path path = Paths.get("C:/rafaelnadal/tournaments/2009", "BNP.txt");
Path path = Paths.get("C:", "rafaelnadal/tournaments/2009", "BNP.txt");
Path path = Paths.get("C:", "rafaelnadal", "tournaments", "2009", "BNP.txt");
1
2
3
Path path=Paths.get("C:/rafaelnadal/tournaments/2009","BNP.txt");
Path path=Paths.get("C:","rafaelnadal/tournaments/2009","BNP.txt");
Path path=Paths.get("C:","rafaelnadal","tournaments","2009","BNP.txt");

定义根目录的相对路径

相对路径是绝对路径中的一部分。相对路径经常在创建 web 页面的时候使用。相对路径比绝对路径使用更广泛。定义当前文件存储根目录的相对路径,此路径需要由文件分隔符开始。在下面的例子中,如果当前文件存储的根 目录是 C: ,那么文件的绝对路径就是 C:\rafaelnadal\tournaments\2009\BNP.txt:

Path path = Paths.get("/rafaelnadal/tournaments/2009/BNP.txt");
Path path = Paths.get("/rafaelnadal","tournaments/2009/BNP.txt");
1
2
Path path=Paths.get("/rafaelnadal/tournaments/2009/BNP.txt");
Path path=Paths.get("/rafaelnadal","tournaments/2009/BNP.txt");

定义工作目录的相对路径

当你定义当前工作目录的相对路径的时候,此路径不需要由文件分隔符开始。假设你的工作目录是 C: 根目录下的 /ATP 目录,那么下面的代码片段定义的文件是 C:\ATP\rafaelnadal\tournaments\2009\BNP.txt:

Path path = Paths.get("rafaelnadal/tournaments/2009/BNP.txt");
Path path = Paths.get("rafaelnadal","tournaments/2009/BNP.txt");
1
2
Path path=Paths.get("rafaelnadal/tournaments/2009/BNP.txt");
Path path=Paths.get("rafaelnadal","tournaments/2009/BNP.txt");

使用通配符定义路径

一般情况下,使用一个点“.”表示当前目录,使用两个点“..”表示父目录这是公认的做法。在 NIO.2 中可以使用 Path.normalize() 方法来消除路径中的冗余(即删除路径中的 /. 或 /..):

Path path = Paths.get("C:/rafaelnadal/tournaments/2009/dummy/../BNP.txt").normalize();
Path path = Paths.get("C:/rafaelnadal/tournaments/./2009/dummy/../BNP.txt").normalize();
1
2
Path path=Paths.get("C:/rafaelnadal/tournaments/2009/dummy/../BNP.txt").normalize();
Path path=Paths.get("C:/rafaelnadal/tournaments/./2009/dummy/../BNP.txt").normalize();

如果你想看看 normalize() 方法的效果,可以分别打印下面两行代码执行后的路径:

Path noNormalize = Paths.get("C:/rafaelnadal/tournaments/./2009/dummy/../BNP.txt");
Path normalize = Paths.get("C:/rafaelnadal/tournaments/./2009/dummy/../BNP.txt").normalize();
1
2
Path noNormalize=Paths.get("C:/rafaelnadal/tournaments/./2009/dummy/../BNP.txt");
Path normalize=Paths.get("C:/rafaelnadal/tournaments/./2009/dummy/../BNP.txt").normalize();

使用 System.out.println() 分别打印两个结果,可以看到 normalize 方法移除了冗余信息:

C:\rafaelnadal\tournaments\.\2009\dummy\..\BNP.txt
C:\rafaelnadal\tournaments\2009\BNP.txt
1
2
C:\rafaelnadal\tournaments\.\2009\dummy\..\BNP.txt
C:\rafaelnadal\tournaments\2009\BNP.txt

使用 URI 定义路径

在有的情况下,你可能需要从 URI 创建 Path 对象。可以通过 URI.create() 从给定的字符串创建 URI 对象,然后将 URI 对象作为参数传给 Paths.get() 方法。如果你需要将浏览器的地址栏输入的信息封装进字符串的话,这一招非常有用:

import java.net.URI;

Path path = Paths.get(URI.create("file:///rafaelnadal/tournaments/2009/BNP.txt"));
Path path = Paths.get(URI.create("file:///C:/rafaelnadal/tournaments/2009/BNP.txt"));
1
2
3
4
import java.net.URI;
Path path=Paths.get(URI.create("file:///rafaelnadal/tournaments/2009/BNP.txt"));
Path path=Paths.get(URI.create("file:///C:/rafaelnadal/tournaments/2009/BNP.txt"));

使用 FileSystems.getDefault().getPath() 定义路径

另一个创建 Path 对象的通用方法是通过 FileSystem 类。首先调用 getDefault() 方法获得默认 FileSystem—— NIO.2 将会生成可以访问默认文件系统的通用对象。然后,调用 getPath() 方法(前面例子中使用的 Paths.get() 方式是这种方式的简写形式):

import java.nio.file.FileSystems;

Path path = FileSystems.getDefault().getPath("/rafaelnadal/tournaments/2009", "BNP.txt");
Path path = FileSystems.getDefault().getPath("/rafaelnadal/tournaments/2009/BNP.txt");
Path path = FileSystems.getDefault().getPath("rafaelnadal/tournaments/2009", "BNP.txt");
Path path = FileSystems.getDefault().
                        getPath("/rafaelnadal/tournaments/./2009","BNP.txt").normalize();
1
2
3
4
5
6
7
import java.nio.file.FileSystems;
Path path=FileSystems.getDefault().getPath("/rafaelnadal/tournaments/2009","BNP.txt");
Path path=FileSystems.getDefault().getPath("/rafaelnadal/tournaments/2009/BNP.txt");
Path path=FileSystems.getDefault().getPath("rafaelnadal/tournaments/2009","BNP.txt");
Path path=FileSystems.getDefault().
                       getPath("/rafaelnadal/tournaments/./2009","BNP.txt").normalize();

获取 Home 目录的路径

当你在需要获得 Home 目录的路径的时候,可以使用下面的样例代码(返回的 Home 目录依赖不同的机器和不同的操作系统):

Path path = Paths.get(System.getProperty("user.home"), "downloads", "game.exe");
1
Path path=Paths.get(System.getProperty("user.home"),"downloads","game.exe");

在我的 Windows 7 机器上,将会返回 C:\Users\Terry\downloads\game.exe,在我的 Linux 上,将会返回 /home/Terry/downloads/game.exe。

JAVA nio 2 定义 Path 类的更多相关文章

  1. JAVA nio 2 和 Path 类简介

    想要初步了解 NIO.2 API,也就是通常所说的“JSR203: More New I/O APIs for the Java Platform”,最好的切入点就是新的抽象类 java.nio.fi ...

  2. 转载Java NIO中的Files类的使用

    Java NIO中的Files类(java.nio.file.Files)提供了多种操作文件系统中文件的方法. Files.exists() Files.exits()方法用来检查给定的Path在文件 ...

  3. Java NIO之拥抱Path和Files

    Java面试通关手册(Java学习指南)github地址(欢迎star和pull):https://github.com/Snailclimb/Java_Guide 历史回顾: Java NIO 概览 ...

  4. Java初学者作业——编写 Java 程序,定义 Employee 类以及 HR 类,实现 HR 为 Employee 加薪的功能。

    返回本章节 返回作业目录 需求说明: 编写 Java 程序,定义 Employee 类以及 HR 类,实现 HR 为 Employee 加薪的功能. 实现思路: 定义 Employee 类,并定义属性 ...

  5. Java NIO学习(Path接口、Paths和Files工具类的使用)

    NIO学习:Paths和Files工具类的使用 JDK1.7引入了新的IO操作类.在java.nio.file包下,Java NIO Path接口和Files类. Path接口:Path表示的是一个目 ...

  6. Java NIO.2 使用Path接口来监听文件、文件夹变化

    Java7对NIO进行了大的改进,新增了许多功能: 对文件系统的访问提供了全面的支持 提供了基于异步Channel的IO 这些新增的IO功能简称为 NIO.2,依然在java.nio包下. 早期的Ja ...

  7. Java初学者作业——定义客户类(Customer),客户类的属性包括:姓名、年龄、电话、余额、账号和密码;方法包括:付款。

    返回本章节 返回作业目录 需求说明: 定义客户类(Customer),客户类的属性包括:姓名.年龄.电话.余额.账号和密码:方法包括:付款. 实现思路: 定义 Customer 类,并添加姓名.余额. ...

  8. Java初学者作业——定义英雄类(Hero),英雄类中的属性包括:姓名、攻击力、防御力、生命值和魔法值;方法包括:攻击、介绍。

    返回本章节 返回作业目录 需求说明: 定义英雄类(Hero),英雄类中的属性包括:姓名.攻击力.防御力.生命值和魔法值:方法包括:攻击.介绍. 实现思路: 分析类的属性及其变量类型. 分析类的方法及其 ...

  9. Java初学者作业——定义管理员类(Admin),管理员类中的属性包括:姓名、账号、密码、电话;方法包括:登录、显示自己的信息。

    返回本章节 返回作业目录 需求说明: 定义管理员类(Admin),管理员类中的属性包括:姓名.账号.密码.电话:方法包括:登录.显示自己的信息. 实现思路: 分析类的属性及其变量类型. 分析类的方法及 ...

随机推荐

  1. Monaco Editor 使用入门

    以前项目是用ace编辑器的,但是总有些不敬人意的地方.前端事件看见的VS Code编辑器Monaco Editor准备更换下,下面介绍一些使用中遇到的一点问题.代码提示 1.项目引用 import * ...

  2. bzoj 2819

    2819 思路: 手工栈: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 500005 #define ma ...

  3. python使用cookie登陆网页

    python2: Python 爬虫入门六之 Cookie 的使用 python3: Python3 网络爬虫 (六):Python3 使用 Cookie - 模拟登陆获取妹子联系方式 python ...

  4. jquery validate不用submit提交,用js提交的

    jquery validate控件 默认是使用submit提交的, 要想改成使用button的click事件处理函数中手工提交, 可以按照如下方式操作: 1 绑定form的validate, 2 然后 ...

  5. 【BZOJ】4671: 异或图

    题解 写完之后开始TTTTTTT--懵逼 这道题我们考虑一个东西叫容斥系数啊>< 这个是什么东西呢 也就是\(\sum_{i = 1}^{m}\binom{m}{i}f_{i} = [m ...

  6. 【洛谷】P4207 [NOI2005]月下柠檬树

    题解 原来自适应simpson积分是个很简单的东西! 我们尝试分析一下影子,圆的投影还是圆,圆锥的尖投影成一个点,而圆台的棱是圆的公切线,我们把圆心投影出来,发现平面上圆心的距离是两两高度差/tan( ...

  7. memory_get_usage()查看PHP脚本使用内存

    memory_get_usage()可以查看当前php使用的内存大小.对于优化算法提高内存使用效率还是很实用的,尤其是对当下的移动端程序. <?php echo memory_get_usage ...

  8. 最详细的vue-cli安装教程 &^没有之一 ^& 大神亲测。。╮( ̄▽  ̄)╭

    这里介绍使用git安装,电脑自带命令行依然可以使用进行安装 第一步 node环境安装 1.1 如果本机没有安装node运行环境,请下载node 安装包进行安装 1.2 如果本机已经安装node的运行换 ...

  9. 层级目录结构的Makefile递归编译方法

    层级目录结构的Makefile编写方法. 层级目录结构的Makefile编写方法. 0.前言 1.如何编译整个工程 2.过滤每层不需要编译的目录 3将所有输出文件定向输出. 0.前言 假如现在有这样一 ...

  10. HDU 6103 Kirinriki (思维 双指针)

    Kirinriki Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...