网站首页 > java教程 正文
1. 前言
Java 开发中我们经常要获取文件的路径,比如读取配置文件等等。今天我们就关于文件的路径和如何读取文件简单地探讨一下。
2. 文件的路径
文件的路径通常有 相对路径 与 绝对路径。
2.1 相对路径
以当前文件为基准进行一级级目录指向被引用的资源文件。在 Java 代码中以当前运行的代码所在的位置为参照位置,只要被引用的文件相对于引用的文件的位置不变就可以被读取到。一旦改变相对位置就无法被读取到。
2.2 绝对路径
文件在文件系统中真正存在的路径,是指从硬盘的根目录(Windows为盘符)开始,进行一级级目录指向文件(从根目录一层层读写)。绝对路径顾名思义就是绝对的地址,就像你只要告诉别人你家的门牌号,他就能找到你家。而不是相对位置你告诉他在老王家的隔壁一样。
2.3 路径速记符
我们经常看到一些文件目录路径使用一些符号来简写,这里有必要总结一下(以类 Unix系统为例):
标识符 说明
../
表示当前文件所在的目录的上一级目录
./
表示当前文件所在的目录
/
表示根目录
~
当前用户目录, mac 下为 /Users/username,而 win10下为c:usersusername
Windows 下基本将 / 改为 `` 即可。
3. Java中读取文件
我们先来声明一个测试路径:
foo
|_src
| |_Test.java
| |_app.yml
其中 Test.java 用来编写读取 app.yml 文件的逻辑。Java 中通过java.io.File 来进行文件操作。并且提供了以下三个方法来获取文件的路径。
3.1 getPath
该方法返回文件抽象路径名的字符串形式。实际上就是传递给 File 构造函数的路径名。
因此,如果 File 对象是使用相对路径创建的,则返回的值也将是相对路径。如果是绝对路径就返回绝对路径。
File file = new File("./app.yml");
# 输出 path = ./app.yml
System.out.println("path = " + file.getPath());
# 如果为绝对路径
File file = new File("/Users/dax/IdeaProjects/foo/src/app.yml");
# 输出 path = path = /Users/dax/IdeaProjects/foo/src/app.yml
System.out.println("path = " + file.getPath());
3.2 getAbsolutePath
该方法返回文件的绝对路径。请注意!这里是有大坑的。如果你的文件在 Java 工程内,路径是按照编译后的路径计算的。
File file = new File("./app.yml");
# absolutePath = /Users/dax/IdeaProjects/foo/./app.yml
System.out.println("absolutePath = " + absolutePath);
同时我们发现该方法只解析当前目录(上面代码所在的目录)的相对路径,如果初始化中的路径包含了 2.3 章节 中的 速记符 ,速记符 将不会被解析。
因为速记符的存在,一个文件在文件系统中的 绝对路径 可以有很多个。
3.3 getCanonicalPath
速记符 不被解析有时候是很痛苦的事,我们可能需要知道具体的路径。getCanonicalPath() 方法解决了这个问题。
File file = new File("./app.yml");
# canonicalPath = /Users/dax/IdeaProjects/foo/app.yml
System.out.println("canonicalPath = " + file.getCanonicalPath());
由于getCanonicalPath()读取的是文件系统,因此会降低性能。如果我们确定没有使用速记符,并且驱动器号大小写已标准化(如果使用Windows OS),我们应该首选使用getAbsoultePath(),除非你的项目中必须使用 getCanonicalPath()。
规范路径(不包含速记符)对于一个固定位置的文件来说是唯一的。
猜你喜欢
- 2024-10-06 一文搞定java.lang.Class.isInstance和instanceof的区别
- 2024-10-06 如何使用Java 文件系统 File类?(java files类)
- 2024-10-06 Spring问题之提示文件不存在处理it does not exist
- 2024-10-06 Java中类加载器的工作原理(java中类加载器有几种)
- 2024-10-06 java常见问题(java常见问题及答案)
- 2024-10-06 「Java」常用的文件操作(java 文件处理)
- 2024-10-06 JAVA中的文件操作2-如何读写文件(java高并发读写文件)
- 2024-10-06 bitmap算法:如何在20亿个非负整数中如何判断一个数是否存在?
- 2024-10-06 Java 如何验证文件名的有效性?(java判断文件名包含字符串)
- 2024-10-06 java中读取properties文件最简单的方法
你 发表评论:
欢迎- 最近发表
-
- 你真的会用 Java 中的线程池吗?多个企业级线程池工具类封装实践
- 线程池的实现原理、优点与风险、以及四种线程池实现
- Java线程池ThreadPoolExecutor实现原理剖析
- 深入分析线程池的实现原理(线程池是干嘛的)
- 一文搞懂JAVA线程池工作原理(java线程池的工作流程)
- Java线程池的工作原理(java线程池的实现原理)
- 5分钟读懂C#中TcpClient、TcpListener和Socket三个类的角色
- JVM对象的创建过程(jvm运行过程中创建的对象一般存放在方法区)
- 对象组成与Java内存模型JMM分析(java对象在内存中存储的结构)
- JVM对象内存分配详细过程(栈上分配->TLAB->老年代->Eden区)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)