Java中的获取文件的物理绝对路径,和读取文件

码林薄雾
• 阅读 19904

获取文件的绝对路径,读取该文件

一、文件目录打印图

下面的文件目录图,是项目中文件的位置信息;下面的例子是按照这个图来演示的。

.
|-- java
|   |-- ibard
|   |   |-- demo1
|   |   |   `-- DemoTest1.java
|   |   `-- demo2
|   |       `-- DemoTest2.java
`-- resources
    |-- demo0.properties
    `-- ibard
        |-- demo2
        |   `-- demo2.properties
        `-- demo3
            `-- demo3.properties

项目打包发布后的目录结构:(要注意的是,我们操作的文件状态是下面这个目录的情形!)

target
|-- classes
|   |-- ibard
|   |   |-- demo0.properties
|   |   |-- demo1
|   |   |   `-- DemoTest1.java
|   |   `-- demo2
|   |       `-- DemoTest2.java
|   |   |   `-- demo2.properties
|   |   |-- demo3
|   |       `-- demo3.properties

二、properties文件介绍

以下内容引自Wikipedia:

.properties 文件是一种和java相关的文件拓展,用于存储配置信息。每个参数以一对字符串的信息存储,即key-value 对。

属性信息的格式:

可以是:key=valuekey = valuekey:valuekey value

#! 用于注释该行(当其在属性中时,将不起作用),\ 用于转义和拼接多行的value

wikipedia的properties文件模板:

# You are reading the ".properties" entry.
! The exclamation mark can also mark text as comments.
# The key characters =, and : should be written with
# a preceding backslash to ensure that they are properly loaded.
# However, there is no need to precede the value characters =, and : by a backslash.
website = https://en.wikipedia.org/
language = English
# The backslash below tells the application to continue reading
# the value onto the next line.
message = Welcome to \
          Wikipedia!
# Add spaces to the key
key\ with\ spaces = This is the value that could be looked up with the key "key with spaces".
# Unicode
tab : \u0009
# If you want your property to include a backslash, it should be escaped by another backslash
path=c:\\wiki\\templates
# However, some editors will handle this automatically

三、获取文件路径

注意: 这里我们讲的获取文件路径和读取文件,有一个最高级范围的限定的前提。

在java项目和web项目中,其最高级的目录只能是并行的java 目录和resource 目录。

因此,我们只能操作java 中的源代码文件和resource 的资源文件。对于web项目来说,我们是无法通过这里讲的方法来获取webapp 目录下的文件的。

我们想获得的文件路径,无非是两种。一是java类文件的路径(*.java ),二是资源文件的路径(*.properties或其他资源文件)。通常情况下,我们主要是想获取资源文件的路径。

这里我们使用DemoTest2.java 类来获取demo2.propertiesdemo3.properties 这两个文件的路径。

说明: 下面所讲的方法,其定位参照的方法都是借助.class 类文件来展开的(也就是第2个目录结构图),因此其位置都是编译后的文件位置(当然,通常其位置和源代码位置一致)。

我们所获取的文件路径,都是绝对路径(相对于系统而言的全写路径)。比如windows下会是C:/user/ibard/desktop/....,linux下会是/opt/tomcat8/...这样的物理绝对路径。

1、URL <- Concrete.class.getResource(String path)方法

在这里,path可以是相对路径,也可以是绝对路径(绝对路径的path以/ 开头,指向你程序的根目录)。得到的结果是URL 类型。

1.1、path使用相对路径

当使用相对路径时,其参照目录是当前类文件所在的目录。当path传入的值为"" 时,获取的就是当前目录的路径。

// DemoTest2.java文件的部分代码

// 1.DemoTest2.java中获取demo2.properties文件的URL
URL url_1 = DemoTest2.class.getResource("demo2.properties");
// 2.生成File对象
File file_1 = new File(url_1.getFile());
// 3.获取文件的绝对路径值
String filepath_1 = file_1.toPath();
1.2、path使用绝对路径

当使用绝对路径时,必须是以/ 开头,这代表了当前java源代码的根目录。当path传入的值为/ 时,获取的就是java源代码的根目录。

// DemoTest2.java文件的部分代码

// 1.DemoTest2.java获取demo3.properties文件的URL
URL url_2 = DemoTest2.class.getResource("/ibard/demo3/demo3.properties");
File file_2 = new File(url_2.getFile());
String filepath_2 = file_2.toPath();
当要获取的资源文件与当前java类不在同一个包下时,应该使用绝对路径的方式来获取资源文件的绝对路径,进而来生成File对象操作文件。

2、URL <- Concrete.class.getClassLoader().getResource(String path)方法

在这里,通过获取类加载器来获取资源文件的路径。path只能是绝对路径,而且该绝对路径是不以/开头的。其实介绍的第一种方法,其内部源码就是调用这种方法。

// DemoTest2.java文件的部分代码

// 1.DemoTest2.java获取demo2.properties文件的URL
URL url_3 = DemoTest2.class.getClassLoader().getResource("ibard/demo2/demo2.properties");
File file_3 = new File(url_3.getFile());
String filepath_3 = file_3.toPath();

总结

上面介绍的2种方法都是用来获取文件的File对象和绝对路径。而File 对象在后面的资源文件的读取中就会使用到。

四、读取资源文件

更多的时候,我们是要读取资源文件内部的信息。对于.properties 文件(一般是键值对的形式保存信息),在java 中有一个与其对应的类,即Properties 类。通过构造Properties 类,我们可以读取资源的keyvalue

1、 Properties对象读取资源文件

1.1、生成properties 对象

首先,我们需要生成Properties 对象:Properties properties= new Properties();

1.2、获取资源文件的输入流

然后,我们需要得到资源文件的输入流,而得到输入流的方法有两种。

1.2.1、Concrete.class.getResourceAsStream(String path)

path可以是相对路径,也可以是绝对路径。

InputStream in = DemoTest2.class.getResourceAsStream("demo2.properties");
1.2.2、Concrete.class.getClassLoader().getResourceAsStream(String path)

path只能是绝对路径。但是绝对路径却不以/ 开头,和之前相反了

InputStream in = DemoTest2.class.getClassLoader().getResourceAsStream("ibard/demo3/demo3.properties");
1.3、加载输入流,获取值

在得到输入流之后,将输入流加载到Properties 对象,之后就可以获取值了。

// 加载输入流对象
properties.load(in);
String value = properties.getProperty("name");
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Peter20 Peter20
4年前
mysql中like用法
like的通配符有两种%(百分号):代表零个、一个或者多个字符。\(下划线):代表一个数字或者字符。1\.name以"李"开头wherenamelike'李%'2\.name中包含"云",“云”可以在任何位置wherenamelike'%云%'3\.第二个和第三个字符是0的值wheresalarylike'\00%'4\
Wesley13 Wesley13
3年前
Java项目读取resources资源文件路径那点事
  今天在Java程序中读取resources资源下的文件,由于对Java结构了解不透彻,遇到很多坑。正常在Java工程中读取某路径下的文件时,可以采用绝对路径和相对路径,绝对路径没什么好说的,相对路径,即相对于当前类的路径。在本地工程和服务器中读取文件的方式有所不同,以下图配置文件为例: !(https://oscimg.oschina.net/o
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Stella981 Stella981
3年前
Linux dirname、basename 指令
一、dirname指令1、功能:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)2、用法:dirnamefilename例如下面几个例子(1)dirname/etc/sysconfig/networkscripts/ifcfgeth0/etc/sysconfig/network
Wesley13 Wesley13
3年前
mysql之索引
一.索引:索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据。对于索引,会保存在额外的文件中1.1.创建一个索引:mysqlcreateindexix_classontb3(class_id);QueryOK,0rowsaffected(0.02sec)
Wesley13 Wesley13
3年前
2.21 软链接文件
软链接介绍链接文件分为硬链接文件(hardlink)和软链接文件(symboliclink),两种链接的本质区别在于inode。软链接文件:是建立一个独立的文件,当读取这个链接文件时,它会把读取的行为转发到该文件所链接的文件上。做软链接尽量使用绝对路径。例子root@hf0
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
码林薄雾
码林薄雾
Lv1
那些离乱的现实,岂能容我当作思绪来写。
文章
4
粉丝
0
获赞
0