在目前的微服务和容器部署的SpringBoot坏境下,我们一般将项目直接打成 jar包的方式运行(java -jar *),我们可能需要读取resources目录下的自定义文件,想在程序运行时找到该目录,并读取需要的文件。
当时我使用 System.getProperty("user.dir") 获取工作目录的坑,本地idea工具运行没问题,但是一但打成jar包,路径会变成jar包所在的目录,无法读取jar内部的文件, 不建议用这种方式 。
由于jar中的文件都属于资源的一种,所以获取需从类加载器进行获取。正确的姿势是采用 this.getClass().getClassLoader().getResourceAsStream() 的方式。
读取自定义文件时,由于getResourceAsStream方法返回的是一个InputStream流,采用InputStreamReader这种方式 最好指定一种编码方式 ,不然可能 中文乱码 !(我在解析xml时中文乱码)
import java.io.BufferedReaderimport java.io.InputStream
import java.io.InputStreamReader
import java.util.jar.JarEntry
import java.util.jar.JarFile
public class ReadOutJarFile {
public static void main(String[] args) throws Exception {
String jarName="C://test.jar"//Jar包所在的位置
String fileName="com/111.txt"//文件在jar包里的路径
JarFile jarFile = new JarFile(jarName)//读入jar文件
先看代码目录结构:\x0d\x0asrc/weather/\x0d\x0aQueryWeather.java\x0d\x0aweather.xml\x0d\x0a程序里面可以直接读取到weather.xml文件,代码如下:\x0d\x0aprivate static String getXmlContent()throws IOException {\x0d\x0aFileReader f = new FileReader("src/weather/weather.xml")\x0d\x0aBufferedReader fb = new BufferedReader(f)\x0d\x0aStringBuffer sb = new StringBuffer("")\x0d\x0aString s = ""\x0d\x0awhile((s = fb.readLine()) != null) {\x0d\x0asb = sb.append(s)}return sb.toString()}但是一旦把这个class文件和xml文件打成jar包再运行,对不起,报错,QueryWeather.class字节码根本找不到weather.xml\x0d\x0a在看打成jar包的结构:META-INFMANIFEST.MFweatherQueryWeather.class\x0d\x0aweather.xml\x0d\x0a用下面的方法就可以找到weather.xml\x0d\x0aprivate static String getXmlContent()throws IOException {\x0d\x0aReader f = new InputStreamReader(QueryWeather.class.getClass().getResourceAsStream("/weather/weather.xml"))\x0d\x0aBufferedReader fb = new BufferedReader(f)\x0d\x0aStringBuffer sb = new StringBuffer("")\x0d\x0aString s = ""欢迎分享,转载请注明来源:内存溢出
评论列表(0条)