正确读取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);