Java项目中获取路径的绝对路径问题和相对路径问题

作者:华为云开发者社区 时间:2023-07-09 13:25:01 

前言:

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

1.目录结构

Java项目中获取路径的绝对路径问题和相对路径问题

2.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

3.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

3.1区别

两者的区别:

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

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

3.2ClassLoader

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

获取 classLoader 的方法:

  • Thread.currentThread().getContextClassLoader()

  • ClassLoader.getSystemClassLoader().

  • 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.properties
file:/E:/ideawork/pathdemo/out/production/pathdemo/src.properties

 扩展一下: 获取项目的硬盘目录 直到项目名级别的目录

// 输出:E:\sparkwork\pathdemo
System.out.println(System.getProperty("user.dir"));

3.3关于 URL 的一些知识

URL fileURL = Main.class.getResource("/src.properties");
// 输出:file:/E:/sparkwork/pathdemo/out/production/pathdemo/src.properties
System.out.println(fileURL.toURI());
// 输出:/E:/sparkwork/pathdemo/out/production/pathdemo/src.properties
System.out.println(fileURL.getPath());

// 这两种方法都是可以的 
File file = new File(fileURL.toURI());
Filw file2 = new File(fileURL.getPath())

来源:https://blog.51cto.com/u_15214399/5010698

标签:Java,项目,获取,路径
0
投稿

猜你喜欢

  • C#和Java有什么区别和联系

    2022-01-02 04:33:26
  • 微信举报解除和微信解除限制的6个方法

    2022-01-07 22:30:46
  • C#实现基于IE内核的简单浏览器完整实例

    2021-12-04 02:08:02
  • IntelliJ IDEA 2022.2 正式发布新功能体验

    2021-08-14 02:47:33
  • 解决使用json-lib包实现xml转json时空值被转为空中括号的问题

    2022-10-20 02:12:14
  • 解决Mybatis-Plus操作分页后数据失效问题

    2023-11-25 11:31:55
  • JAVA中 Spring定时器的两种实现方式

    2022-10-11 02:33:45
  • Java数组索引异常产生及解决方案

    2023-11-05 16:52:27
  • SpringBoot @Validated注解实现参数分组校验的方法实例

    2023-01-02 11:18:50
  • c#中返回文章发表的时间差的示例

    2021-08-18 16:51:26
  • 如何解决java压缩文件乱码问题

    2022-05-20 09:15:57
  • Java用邻接矩阵存储图的示例代码

    2021-10-05 21:39:18
  • C#实现将一个字符串进行翻转显示的6种方法

    2022-05-07 22:55:10
  • Visual Studio 2019 清理空行问题(非正则表达式)

    2023-10-27 16:05:22
  • C#接口interface用法实例

    2023-11-07 11:55:54
  • Spring Security OAuth 自定义授权方式实现手机验证码

    2021-10-03 23:30:27
  • Android 使用 okhttp3和retrofit2 进行单文件和多文件上传

    2023-04-29 07:33:22
  • Android开发之关于项目

    2023-05-08 23:38:24
  • 一文读懂Spring Bean的生命周期

    2022-11-01 04:01:20
  • redis统计APP在线人数的实例

    2023-11-24 23:56:54
  • asp之家 软件编程 m.aspxhome.com