写点什么

你知道,java 项目中是如何获取文件地址的吗?

  • 2022 年 2 月 15 日
  • 本文字数:2257 字

    阅读完需:约 7 分钟

本文分享自华为云社区《【Java】Java项目的绝对地址和相对地址问题以及ClassLoader》,作者: Copy 工程师。


在 Java 项目中我们经常会读取配置文件,但是文件的路径在获取时我们是怎么得到的?因为我总是忘记获取文件地址的方法,就在此记录一下。

关于在获取路径的的绝对路径问题和相对路径问题

在纯 Java 代码里 我们一般都会用class.getResource(String name) 或者 class.getClassLoader().getResource(String name) 两种方法获取文件的地址 (当然不止这两种方法)。今天就说说这两种方法的异同。这里说的纯 Java 代码不是 Java web 项目。


目录结构



class.getResource(String name)

输入:可以接受相对路径(相对于该 class 类)或者绝对路径(根目录符号为 / 代表项目的根目录 不代表硬盘的根目录)

返回:URL 对象 该对象表示指向 name 的资源

// 获取相对路径 此时获取的是该class文件的同级目录System.out.println("相对路径:同级目录下的配置文件>"+Main.class.getResource("demo.properties"));// 获取的绝对路径 相对于跟目录来说的System.out.println("绝对路径:同级目录下的配置文件>"+Main.class.getResource("/com/xing/demo/demo.properties"));System.out.println("相对路径:上一级目录下的配置文件>"+Main.class.getResource("../xing.properties"));System.out.println("绝对路径:根目录下的配置文件>"+Main.class.getResource("/src.properties"));
// 当传入的是绝对路径(带有‘/’)的时候,getresource()方法会从项目的根目录开始解析路径地址输出:相对路径:同级目录下的配置文件>file:/E:/ideawork/pathdemo/out/production/pathdemo/com/xing/demo/demo.properties绝对路径:同级目录下的配置文件>file:/E:/ideawork/pathdemo/out/production/pathdemo/com/xing/demo/demo.properties相对路径:上一级目录下的配置文件>file:/E:/ideawork/pathdemo/out/production/pathdemo/com/xing/xing.properties绝对路径:根目录下的配置文件>file:/E:/ideawork/pathdemo/out/production/pathdemo/src.properties
复制代码

class.getClassLoader().getResource(String name)

输入:只能接受相对路径 但此相对路径是相对于根目录来说的

返回:URL 对象

// src 在根目录下  这里的同级也就是根目录了System.out.println("相对路径:同级目录下的配置文件>"+Main.class.getClassLoader().getResource("src.properties"));System.out.println("相对路径:相对根目录的下一级目录下的配置文件>"+Main.class.getClassLoader().getResource("com/com.properties"));System.out.println("相对路径:相对根目录的下下一级目录下的配置文件>"+Main.class.getClassLoader().getResource("com/xing/xing.properties"));
输出:相对路径:同级目录下的配置文件>file:/E:/ideawork/pathdemo/out/production/pathdemo/src.properties相对路径:相对根目录的下一级目录下的配置文件>file:/E:/ideawork/pathdemo/out/production/pathdemo/com/com.properties相对路径:相对根目录的下下一级目录下的配置文件>file:/E:/ideawork/pathdemo/out/production/pathdemo/com/xing/xing.properties
复制代码

注意

/**  * 下面两种有相同的作用  */System.out.println("==相对路径:同级目录下的配置文件>"+Main.class.getResource("demo.properties"));System.out.println("==相对路径:相对根目录的下下一级目录下的配置文件>"+Main.class.getClassLoader().getResource("com/xing/demo/demo.properties"));
输出:==相对路径:同级目录下的配置文件>file:/E:/ideawork/pathdemo/out/production/pathdemo/com/xing/demo/demo.properties==相对路径:相对根目录的下下一级目录下的配置文件>file:/E:/ideawork/pathdemo/out/production/pathdemo/com/xing/demo/demo.properties
复制代码

区别

两者的区别:


其实我们看源码就知道 class.getResource 其实就是用的 class.getClassLoader().getResource(String name)。


只不过是 class.getResource 会通过 resolveName 这个方法把传入的路径都转换为符合 class.getClassLoader().getResource()的路径 然后让 getClassLoader 处理。


ClassLoader


class.getClassLoader().getResource(String name) 使用的是 ClassLoader,而 ClassLoader 的获取是有很多方法的。


获取 classLoader 的方法:

  1. Thread.currentThread().getContextClassLoader()

  2. ClassLoader.getSystemClassLoader().

  3. class.getClassLoader()

System.out.println(Thread.currentThread().getContextClassLoader().getResource("src.properties"));System.out.println(ClassLoader.getSystemClassLoader().getResource("src.properties"));
输出:file:/E:/ideawork/pathdemo/out/production/pathdemo/src.propertiesfile:/E:/ideawork/pathdemo/out/production/pathdemo/src.properties
// 扩展一下 获取项目的硬盘目录 直到项目名级别的目录// 输出:E:\sparkwork\pathdemoSystem.out.println(System.getProperty("user.dir"));
复制代码

关于 URL 的一些知识

URL fileURL = Main.class.getResource("/src.properties");// 输出:file:/E:/sparkwork/pathdemo/out/production/pathdemo/src.propertiesSystem.out.println(fileURL.toURI());// 输出:/E:/sparkwork/pathdemo/out/production/pathdemo/src.propertiesSystem.out.println(fileURL.getPath());
// 这两种方法都是可以的 File file = new File(fileURL.toURI());Filw file2 = new File(fileURL.getPath())
复制代码

点击关注,第一时间了解华为云新鲜技术~


发布于: 刚刚阅读数: 3
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
你知道,java项目中是如何获取文件地址的吗?