Java项目访问resources文件

  • 最近在对接支付宝支付的开发,须要取到支付的RSA公钥和私钥。因而把公钥和私钥加到resources文件夹里。可是不知道怎么读到这两个文件,也就是不知道路径怎么写。因而网上搜索了下如何获取工做路径,System.getProperty("user.dir"); 用单元测试跑了下,能够拿到Module路径。
    1
  • 获得D:\WorkSpace\daikuan\aic\aic-common
    aic是project aic-common 是module路径。而后部署到Tomcat下获取到的就是D:\Java\apache-tomcat-8.5.8\bin 了,居然是Tomcat路径。
    2java

  • 因此使用System.getProperty("user.dir");取项目文件这一招很差使,咨询其余同事得知能够经过ClassLodaer路径获取项目下得文件。getClassLoader代码以下apache

public static ClassLoader getClassLoader() {
            ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        
            if (classLoader == null) {
                classLoader = PropertiesUtil.class.getClassLoader();
            }
            return classLoader;
        }
  • getResources返回来的是一个URL 对象集合,不尽友好,但仍是能够用,项目结构以下

3

  • ClassLoader 并未提供class的路径,可是提供了getResources用以搜索class下的文件,获取密钥的代码以下
Enumeration<URL> keyPath= PropertiesUtil.getClassLoader().getResources("resources\\tianping\\private-rsa.pfx");
        URL url=null;
        String path=null;
        while(keyPath.hasMoreElements()){
            url=keyPath.nextElement();
            System.out.println(url.getPath());
            String path=url.getPath();
        }
  • 返回来的 keyPath 是空的,同事取configuration.properties是没问题,那么问题应该出在我写的路径上。比这时候我去生成的war包里查看了下configuration.properties和tianping文件夹的相对关系,如图所示
    4
  • configuration.properties就在classes 路径下,而我放在resources的路径的天平文件夹也在classes路径下,大概是Maven打包的缘由吧。因而我就直接将"resources\tianping\private-rsa.pfx" 改为了"tianping\private-rsa.pfx"
  • 改完以后打印出来的是这样一个路径 /D:/WorkSpace/daikuan/chexian-axb-service/target/classes/tianping%5cprivate-rsa.pfx。%5 给人感受是转过编码似的,因此我作了个 URLDecoder.decode 解码获得/D:/WorkSpace/daikuan/chexian-axb-service/target/classes/tianping\private-rsa.pfx居然出现了这样的路径 即含有/ 还含有。
  • 而后用FileInputStream ksfis = new FileInputStream(path);试了一下是能够访问的。baidu了下没有找到关于路径中同时有/ \的资料,有点摸不着头脑了。我感受出现 可能会和"tianping\private-rsa.pfx" 有关系,因此我就改为了 "tianping/private-rsa.pfx"返回的路径就正常多了 /D:/WorkSpace/daikuan/chexian-axb-service/target/classes/tianping/private-rsa.pfx 使用FileInputStream也是能够访问的。
相关文章
相关标签/搜索