idea获取maven工程下resources文件的3种方式

前言

在开发项目中经常获取resources下的文件(配置文件及其他各种各样的文件),本文通过java代码在idea环境获取maven工程下的文件及输入流;

如图,我要获取maven项目的resources下的message.properties文件里面的内容

在这里插入图片描述

在这里插入图片描述

1.类加载器获取的两种方式

这里先给一个结论:

A.class.getResource("/") == A.class.getClassLoader().getResource("")

注意:后者路径里面是没有/的

1.1 A.class.getResource("/message.properties")

	@Test
    public void test1() throws IOException {
        URL resource = PathDemo2.class.getResource("/message.properties");
        InputStream inputStream=new FileInputStream(resource.getPath());
        Properties properties=new Properties();
        properties.load(inputStream);
        System.out.println(properties.getProperty("name"));
        //输出结果为中国
    }

1.2 A.class.getClassLoader().getResource(“message.properties”)

 	@Test
    public void test2() throws IOException {
        URL resource =PathDemo2.class.getClassLoader().getResource("message.properties");
        InputStream inputStream=new FileInputStream(resource.getPath());
        Properties properties=new Properties();
        properties.load(inputStream);
        System.out.println(properties.getProperty("name"));
        //输出结果为中国
    }

注意这里面可以直接使用getResourceAsStream获取文件的输入流:

 URL resource = PathDemo2.class.getResource("/message.properties");
 InputStream inputStream=new FileInputStream(resource.getPath());
 //也等价于
 InputStream inputStream=PathDemo2.class.getResourceAsStream("/message.properties")
 InputStream inputStream=PathDemo2.class.getClassLoader().getResourceAsStream("message.properties")

这里还要注意的一个点是URL的getPath()和getFile()相等,但是不等于toString,一开始我直接用toString发现报错了!

 URL resource = PathDemo2.class.getClassLoader().getResource("message.properties");
 System.out.println(resource.getPath().equals(resource.getFile()));  //true
 System.out.println(resource.getPath().equals(resource.toString()));  //false

但是这种情况下是不一样的:

URL url = new URL("file://ftp.yoyodyne.com/pub/files/foobar.txt?id=123456");
System.out.println("url.getFile()="+url.getFile());
System.out.println("url.getPath()="+url.getPath())

url.getFile()=/pub/files/foobar.txt?id=123456
url.getPath()=/pub/files/foobar.txt

分析

Class.getResource(String path)
1.path不以’/'开头时,默认是从此类所在的包下取资源;
2. path 以’/'开头时,则是从ClassPath根下获取;
Class.getResource和Class.getResourceAsStream在使用时,路径选择上是一样的!!!

  • 上面说到的【path以’/'开头时,则是从ClassPath根下获取;】在这里就是相当于bin目录(Eclipse环境下)。
  • 上面说到的【path以’/'开头时,则是从ClassPath根下获取;】在这里就是相当于target目录(Idea环境下)。

Class.getClassLoader().getResource(String path)

​ path不能以’/'开头,path是从ClassPath根下获取;

总结:

1.其实,Class.getResource和ClassLoader.getResource本质上是一样的,都是使用ClassLoader.getResource加载资源的。
2.Class.getResource真正调用ClassLoader.getResource方法之前,会先获取文件的路径(path不以’/‘开头时,默认是从此类所在的包下取资源;path以’/'开头时,则是从项目的ClassPath根下获取资源)。

3.ClassLoader.getResource方法会通过双亲委派机制,先委派双亲去加载类,如果双亲没有加载到,则再由自己加载。

2. 简单的ResourceBundle 读取

这里直接获取路径,不用带/,并且也不要加上.properties,加上反而会报错

	@Test
    public void test3(){
        ResourceBundle res  = ResourceBundle.getBundle("message");
        System.out.println(res.getString("name"));
        //输出结果为中国
    }

3.绝对路径直接获取

也可以使用绝对路径直接获取,但是这个不太推荐,因为换一台机器路径就变了,不灵活!

  	@Test
    public void test5() throws IOException {
        InputStream inputStream=new FileInputStream("E:\\IdeaPro\\apple_test\\src\\main\\resources\\message" +
                ".properties");
        Properties properties=new Properties();
        properties.load(inputStream);
        System.out.println(properties.getProperty("name"));
        //输出结果为中国
    }

另外,这里还有一个获取当前项目路径的方法

在这里插入图片描述

 	@Test
    public void test6(){
        System.out.println(System.getProperty("user.dir"));
        //输出为  E:\IdeaPro\apple_test
    }
### 回答1: 当我们使用Idea来创建一个新的Maven工程时,有时会发现在项目目录下没有src文件夹,这是因为Idea默认的Maven工程结构与传统的Maven工程结构略有不同。 传统的Maven工程结构中,一般会包含src/main/java、src/main/resources和src/test/java等目录,分别用于存放主要的源代码文件、项目资源文件和测试代码文件。然而,Idea在新建Maven工程时默认采用了一简化的结构,将源代码文件直接放在项目根目录下。 这简化的结构在一些小型项目或简单的练习项目中非常方便,因为可以直接在项目根目录下编写源代码,无需再创建多层目录结构。同时,资源文件也可以直接放置在根目录下或者其他相应的文件夹中。 如果我们希望使用传统的Maven工程结构,仍然可以在Idea中创建src/main/java和src/main/resources等目录。只需右键点击项目,选择"New" - "Directory",然后输入对应的目录名即可。接下来在这些目录中创建相应的Java源代码文件和资源文件即可。 需要注意的是,如果我们使用Idea的默认结构进行开发,当我们在src目录下添加新的文件夹时,Idea通常会自动识别并将其设置为对应的资源类型。 综上所述,当我们在Idea中新建Maven工程时,如果没有src文件夹,只需在项目中手动创建并按照传统的Maven工程结构进行编写和组织即可。当然,也可以使用Idea的默认结构进行快速的小型项目开发。 ### 回答2: 当使用IDEA创建一个新的Maven工程时,如果没有自动生成src文件夹,你可以手动创建它。通常情况下,src文件夹是用来存放项目的源码和资源文件的,这是一个通用的约定,但并不是强制的。一些Maven项目可能会选择不使用src文件夹,而是通过其他方式来组织项目结构。 在IDEA中创建一个src文件夹非常简单。你可以按照以下步骤进行操作: 1. 在项目视图中,右键点击你的Maven工程的根目录。 2. 在弹出菜单中,选择"New" -> "Directory"。 3. 输入"src"作为目录的名称,并按下"Enter"键。 这样,你就成功创建了一个src文件夹。在src文件夹下,你可以创建不同的子文件夹来存放不同类型的源码或资源文件,比如"main"文件夹用于存放主要的源码文件,"test"文件夹用于存放测试文件等等。 需要注意的是,如果你的Maven工程使用了不同的项目结构或源码存放方式,那么你可能不需要创建src文件夹,而是根据项目结构去创建相应的文件夹。这完全取决于项目的需求和个人偏好。 总之,如果你发现自动生成的Maven工程中没有src文件夹,你可以手动创建它,或者根据项目需求去创建适合的文件夹结构来存放源码和资源文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Apple_Web

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值