正确读取resources目录下的文件

问题描述:本地可以正常读取areacode.json文件,打成jar包在测试环境找不到该文件。

问题代码:

static {
        StringBuffer strbuffer = new StringBuffer();
        try {
            String path = Thread.currentThread().getContextClassLoader().getResource("areacode.json").getPath();
            File myFile = new File(path);
            if (myFile.exists()) {
                InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(path), "UTF-8");
                BufferedReader in  = new BufferedReader(inputStreamReader);
                String str =null;
                while ((str = in.readLine()) != null) {
                    strbuffer.append(str);
                }
                in.close();
            }
        } catch (Exception e) {
            e.getStackTrace();
        }
    }

解决方案:

static {
        StringBuffer strbuffer = new StringBuffer();
        try {
            InputStream stream = Thread.currentThread().getContextClassLoader()
                    .getResourceAsStream("areacode.json");
            BufferedReader in = new BufferedReader(new InputStreamReader(stream, "UTF-8"));
            String str = null;
            while ((str = in.readLine()) != null) {
                strbuffer.append(str);
            }
            logger.info("【地区转换工具类】 文件输入流获取完成, 输入流关闭!");
            in.close();
        } catch (Exception e) {
            e.getStackTrace();
        }
}

参考来自:https://blog.csdn.net/baidu_23275675/article/details/82622577

一般方法:

Properties pps = new Properties();
File file = ResourceUtils.getFile("classpath:defult.properties");
pps.load(new FileReader(file));

此时打包成jar运行时会报错: java.io.FileNotFoundException

      • 在调试过程中,文件是真实存在于磁盘的某个目录。此时通过获取文件路径,是可以正常读取的,因为文件确实存在。

      • 而打包成jar以后,实际上文件是存在于jar这个文件里面的资源文件,在磁盘是没有真实路径的。所以通过ResourceUtils.getFile或者this.getClass().getResource("")方法无法正确获取文件。

正确方法:

  •采用流的方式进行处理,同时读取流时设置编码utf-8

  •使用InputStream inputStream=this.getClass().getResourceAsStream("") 会指定要加载的资源路径与当前类所在包的路径一致。因此能正常读取文件。

Properties pps = new Properties();
InputStream stream = getClass()
                    .getClassLoader()
                    .getResourceAsStream("defult.properties"); 
BufferedReader br = new BufferedReader(new InputStreamReader(stream, "UTF-8"));
pps.load(br);

猜你喜欢

转载自www.cnblogs.com/lbky/p/10119966.html