专栏首页码农小胖哥的码农生涯Java 中几种获取文件路径的方式

Java 中几种获取文件路径的方式

1. 前言

Java 开发中我们经常要获取文件的路径,比如读取配置文件等等。今天我们就关于文件的路径和如何读取文件简单地探讨一下。

2. 文件的路径

文件的路径通常有 相对路径绝对路径

2.1 相对路径

以当前文件为基准进行一级级目录指向被引用的资源文件。在 Java 代码中以当前运行的代码所在的位置为参照位置,只要被引用的文件相对于引用的文件的位置不变就可以被读取到。一旦改变相对位置就无法被读取到。

2.2 绝对路径

文件在文件系统中真正存在的路径,是指从硬盘的根目录(Windows为盘符)开始,进行一级级目录指向文件(从根目录一层层读写)。绝对路径顾名思义就是绝对的地址,就像你只要告诉别人你家的门牌号,他就能找到你家。而不是相对位置你告诉他在老王家的隔壁一样。

2.3 路径速记符

我们经常看到一些文件目录路径使用一些符号来简写,这里有必要总结一下(以类 Unix系统为例):

表示当前文件所在的目录的上一级目录

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()

规范路径(不包含速记符)对于一个固定位置的文件来说是唯一的。

本文分享自微信公众号 - 码农小胖哥(Felordcn),作者:码农小胖哥

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Springboot与Elasticsearch完美结合

    在前面一篇已经写了elasticsearch的环境的搭建,那么这一篇就写下springboot与elasticsearch环境的整合。如果没有搭建环境,请参考:...

    码农小胖哥
  • Spring源码(三)-Context的创建核心逻辑(下)

    由于该篇文章较多,所以就拆分为了上下两篇,接上面完成了beanFactory的信息处理,接下来是bean的相关定义的处理。

    码农小胖哥
  • Java 8 Stream Api 中的 peek 操作

    我在Java8 Stream API 详细使用指南[1] 中讲述了 [Java 8 Stream API]( "Java 8 Stream API") 中 ma...

    码农小胖哥
  • python2/3中 将base64数据写成图片,并将图片数据转为16进制数据的方法、bytes/string的区别

    python 3中最重要的新特性可能就是将文本(text)和二进制数据做了更清晰的区分。文本总是用unicode进行编码,以str类型表示;而二进制数据以byt...

    用户1214487
  • ETCD的基本使用 转

    原文地址: http://www.csdn.net/article/2015-01-22/2823659

    domain0
  • 【大数据周记】一周大数据News总结(0907-0913)

    1.四位女生用"刷脸支付"改变传统金融 人脸识别技术能带来什么?用户需来到银行,当面核实身份,才会给予办理。若利用人脸识别,该环节就能大大简化。它通过“看脸”...

    数说君
  • AST 与前端工程化实战

    AST 是一个非常基础但是同时非常重要的知识点,我们熟知的 TypeScript、babel、webpack、vue-cli 都是依赖 AST 进行开发的。本文...

    用户1462769
  • [第5期] AST 与前端工程化实战AST 与前端工程化实战

    AST 是一个非常基础但是同时非常重要的知识点,我们熟知的 TypeScript、babel、webpack、vue-cli 都是依赖 AST 进行开发的。本文...

    用户6900878
  • 怎样利用好量价选股?量价应用法则有哪些?

    许多股民投资者对于成交量变化的规律认识不清,K线分析只有与成交量的分析相结合,才能真正地读懂市场的语言,洞悉股价变化的奥妙。成交量是价格变化的原动力,其在实战...

    郭耀华
  • Scrapy:修改User-Agent方法

    从整个项目中去修改请求头的设置规则,变化多端,不同的写法,可以配置出不同的设置方式。

    弄啥嘞

扫码关注云+社区

领取腾讯云代金券