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

本文分享自华为云社区《【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.properties
file:/E:/ideawork/pathdemo/out/production/pathdemo/src.properties // 扩展一下 获取项目的硬盘目录 直到项目名级别的目录
// 输出:E:\sparkwork\pathdemo
System.out.println(System.getProperty("user.dir"));

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

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

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

  1. java项目中的路径获取,request

    java web项目中获取项目根路径(tomcat可运行的web源码的路径)的方式: 分为两种情况: 情况一: 在eclipse.inde等开发工具中获取(注:如下代码所在的类必须是控制层所在包下的类 ...

  2. ckeditor编辑器在java项目中配置

    一.基本使用: 1.所需文件架包 A. Ckeditor基本文件包,比如:ckeditor_3.6.2.zip 下载地址:http://ckeditor.com/download 2.配置使用 A.将 ...

  3. redis在java项目中的使用

    在上一篇文章中已经讲了redis的spring配置,这篇将会描述redis在java项目中的使用. redis存储形式都是key-value(键值对),按照存储的内容分为两种,一种是存简单数据,即数字 ...

  4. java项目中ehcache缓存最简单用法

      java项目中ehcache缓存最简单用法: 1.下载ehcache-core-2.4.3.jar复制到项目的lib目录下 2.新建ehcache.xml文件,放置在项目src目录下的resour ...

  5. 实战派 | Java项目中玩转Redis6.0客户端缓存!

    原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 哈喽大家好啊,我是Hydra. 在前面的文章中,我们介绍了Redis6.0中的新特性客户端缓存client-side caching,通过tel ...

  6. eclipse java项目中明明引入了jar包 为什么项目启动的时候不能找到jar包 项目中已经 引入了 com.branchitech.app 包 ,但时tomcat启动的时候还是报错? java.lang.ClassNotFoundException: com.branchitech.app.startup.AppStartupContextListener java.lang.ClassN

    eclipse java项目中明明引入了jar包 为什么项目启动的时候不能找到jar包 项目中已经 引入了 com.branchitech.app 包 ,但时tomcat启动的时候还是报错?java. ...

  7. java项目中build path的设置

    右键点击项目新建文件libs 添加jtds  jar包引用本地动态链接库(dll)的设置方法 配置LibraryJRE的添加和更换  Java项目中build path的设置总结,包括JRE的添加和更 ...

  8. 在Java项目中整合Scala

    Scala是一个运行在Java JVM上的面向对象的语言.它支持函数编程,在语法上比Java更加灵活,同时通过Akka库,Scala支持强大的基于Actor的多线程编程.具有这些优势,使得我最近很想在 ...

  9. XML在JAVA项目中的作用

    java项目中,xml文件一般都是用来存储一些配置信息 一般的编程, 多数用来存储配置信息 . 拿JDBC来说,可以把数据库连接字符串写到xml,如果要修改数据源,只需要改xml就可以了,没必要再去重 ...

  10. Redis学习笔记之二 :在Java项目中使用Redis

    成功配置redis之后,便来学习使用redis.首先了解下redis的数据类型. Redis的数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set( ...

随机推荐

  1. GameFramework摘录 - 2.访问器模式(Version、Logger)

    访问器模式 Version.Logger等基础模块,功能相对固定但拥有几套不同的行为(如开发版本和正式版本不同),采用访问器模式,便于调整功能或复用 public static class Versi ...

  2. Android_Camera2_ImageReader_onImageAvailable拍照秒退的解决办法

    public void onImageAvailable(ImageReader reader) { try{ Image image = reader.acquireLatestImage();// ...

  3. docker的疑难杂症

    本篇博客主要是解决docker使用中遇到的常见报错,为了下次能够快速解决同样的问题,专门记录一下,文章会持续更新. 容器名称被占用. Error response from daemon: Confl ...

  4. RLHF · PBRL | SURF:使用半监督学习,对 labeled segment pair 进行数据增强

    论文名称:SURF: Semi-supervised reward learning with data augmentation for feedback-efficient preference- ...

  5. 反转字符串里的单词(leetcode 4.10每日打卡)

    给定一个字符串,逐个翻转字符串中的每个单词.   示例 1: 输入: "the sky is blue"输出: "blue is sky the" 示例 2: ...

  6. Python 中的单下划线和双下划线

    哈喽大家好,我是咸鱼 当我们在学习 Python 的时候,可能会经常遇到单下划线 _ 和双下划线 __ 这两种命名方式 单下划线 _ 和双下划线 __ 不仅仅是只是一种简单的命名习惯,它们在 Pyth ...

  7. javaweb项目搭建|前端项目【包含增删改查,mysql】二

    首先,新建一个javaweb项目[前提已经下载tomcat,mysql,此实验idea版本为2022,其他版本可能位置不一样] File->New->Project 起一个项目名称(随便起 ...

  8. PX4环境安装

    1.安装ROS 利用鱼香ros一键安装: wget http://fishros.com/install -O fishros && . fishros 调用的命令为: roscore ...

  9. Vue2.0 学习 第三组 条件语句

    本笔记主要参考菜鸟教程和官方文档编写.1.v-if在div或者之类的dom中使用v-if可以控制是否插入该dom,控制由v-if的true和false决定.如:<div id="app ...

  10. Mybatis出现Caused by: net.sf.jsqlparser.parser.ParseException: ....异常

    今天在开发项目中遇到了一个奇怪的异常,记录一下把! 异常信息如下(截取了主要的部分) Caused by: net.sf.jsqlparser.parser.ParseException: Encou ...