Java 中获取文件路径的方式,你知道几种?

createh54个月前 (12-30)技术教程83


1. 前言

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

2. 文件的路径

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

2.1 相对路径

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

2.2 绝对路径

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

2.3 路径速记符

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

标识符说明../表示当前文件所在的目录的上一级目录./表示当前文件所在的目录/表示根目录~当前用户目录, mac 下为 /Users/username,而 win10下为c:\users\username

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

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

来源:https://mp.weixin.qq.com/s/zBKz2OaJgUB8sdfyT-kQfA

相关文章

Java路径-37-Java的Iterator(java路径是什么意思)

1 Iterator的概念在Java中,如果我们需要遍历一个集合(Collection)或者数组(Array),我们通常会使用for循环来遍历。但是,当我们需要在遍历的过程中修改集合或者数组时,这种方...

我的世界启动器Java路径如何设置(我的世界官方启动器java路径)

这次搞趣网小编为诸位我的世界PC端玩家带来的是我的世界启动器Java路径如何设置攻略,希望诸位我的世界玩家会喜欢。我的世界java路径设置攻略:1、首先我们要确保电脑中已经下载并安装好了最新的java...

java从jar包中读取资源文件(读取jar包内文件)

由于特别情况,我们通常需要读取jar中的资源;本文只要记录读取资源并通过jar方式运行和在开发IDE中运行的一致性。常规使用#常规使用 - 绝对路径常规使用 - 项目的相对路径取的是当前项目的根目录下...

java创建文件夹的4种方法及其优缺点 最全面总结

本文为大家介绍Java IO-创建文件夹的四种方法,及其优缺点的解析。如果您阅读完成,觉得此文对您有帮助,请给我点个赞,您的支持是我不竭的创作动力。1.传统API创建文件夹方式Java传统的IO AP...

根据进程号排查进程及路径(通过进程号查询数据库)

根据进程号排查进程及路径netstat -ntpl1、lsof -i:端口号2、netstat -tunlp|grep 端口号都可以查看指定端口被哪个进程占用的情况ls -al /proc/22938...

在Java程序中监听mysql的binlog(java监听mysql数据表变化)

1、背景最近在开发的过程中遇到这么一个问题,当产生某种类型的工单后,需要实时通知到另外的系统,由另外的系统进行数据的研判操作。 由于某种原因, 像向消息队列中推送工单消息、或直接调用另外系统的接口、或...