• 关于Class.getResourceAsStream


    Properties properties = new Properties();  
     properties.load(new  InputStreamReader(CharactorTest.class.getResourceAsStream("/CustomValidationMessages.properties"), "UTF-8"));
     System.out.println(properties.getProperty("item.name.length.error"));
     
    首先, 我们必须先了解根路径“/”是如何定义的,这对我们使用getResourceAsStream准确加载文件是很重要的。首先,我们要明白这个根路径是对应类所处类路径上的根目录!
    /WEB-INF/classes
    什么意思呢?假如一个项目经过编译之后生成了如下class文件和目录结构:
     
    1. com  
    2.    |-github  
    3.           |-demo  
    4.           |    |-A.class  
    5.           |    |-1.txt  
    6.           |-B.class  
    7.           |-2.txt  
    在这样的编译输出目录下,文件"1.txt"的绝对路径名为:"/com/github/demo/1.txt" 文件"2.txt"的绝对路径名为:"/com/github/2.txt
    如同getResourceAsStream方法文档上的解释:以/开头时是绝对路径,与类路径不同的是路径上的“."换成了"/"。
     
    接下着我们看相对路径!
     
    首先我们必须明确“相对”路径总是指相对于当前class的路径!
     
    例如,如果我们使用
     
    InputStream is= A.class.getResourceAsStream("1.txt");
     
    路径不是以/开头,说明这是一个相对路径,相对的是A.class这个文件,所以,这里的“1.txt”所指的正确位置是与A.class处于同一目录下的1.txt文件,这一文件是存在的,所引不会报错。
     
    如果我们按相对路径的方式通过A去加载2.txt,则路径应该这样描述:
     
    InputStream is= A.class.getResourceAsStream("../2.txt");   
     
    是的,用“.."表示上一级目录。
     
    如果我们按相对路径的方式通过B去加载1.txt,则路径应该这样描述:   
     
    InputStream is= B.class.getResourceAsStream("demo/1.txt");   
     
    注意!demo前是没有/的,这是一个相对路径,是相对于B所在包下的demo子包里的1.txt文件,所以这个路径也是正确无误的!

    关于ClassLoader.getResourceAsStream

    class.getResourceAsStream最终调用是ClassLoader.getResourceAsStream

    只是在这之前对参数进行了调整。如果参数已/开头,则去除/,否则把当前类的包名加在参数的前面。

    在使用ClassLoader.getResourceAsStream时,路径直接使用相对于classpath的绝对路径,并且不能已 / 开头。

    InputStream resourceAsStream = ClassLoader.getSystemResourceAsStream("com/github/demo/1.txt");
  • 相关阅读:
    Python中replace 不起作用的问题
    java 获取视频时长、大小
    MySQL 自定义排序
    加 synchronized 关键字进行同步
    SQL 查询当前周的开始、结束日期
    Java 按照一定的规则生成递增的编号
    Java中BigDecimal的8种舍入模式
    Lamada 表达式之 sort 排序
    搭建Java环境
    初识JAVA(学习记录)
  • 原文地址:https://www.cnblogs.com/xiangkejin/p/6445751.html
Copyright © 2020-2023  润新知