java读取资源文件

  java读取资源文件正常情况下,大家都很熟悉,不比比直接贴代码。

BufferedReader br = new BufferedReader(
                    new InputStreamReader(new FileInputStream(new File("property/e.txt")),"UTF8"));
String line;
while ((line = br.readLine()) != null) {
         System.out.println(line);
}

这只是其中的一种方式,就不展示了。顺便说一下,读取文件时,虽然FileReader涉及到编码问题的时候容易出错,代码中说:

BufferedReader br = new BufferedReader(new FileReader("property/e.txt"));   
String line= null;   
while ((line= br.readLine()) != null) {   
        lines.add(newString(line.getBytes("GBK"),"UTF-8"));   //这种方式大部分中文显示正常,仍有部分汉字显示为“?”
}   

  当把程序打包之后,在运行jar包时,上述的方式读取文件,报一个无法找到文件路径的异常。

  主要原因是因为jar包是一个单独的文件而非文件夹,绝对不可能通过"file:D:/.../打包名.jar/property/e.txt"这种形式的文件URL来定位e.txt。所以即使使用相对路径,也无法定位到jar文件内的txt文件。

  我们可以通过ClassLoader(类加载器)来加载文件,当调用jar包中的一个类时,比如FileUtil(自定义的),JVM加载进FileUtil类i,并记录这个类运行时信息。ClassLoader类中的方法可以帮助我们动态的获取这些信息

public URL getResource(String name)   查找具有给定名称的资源。资源是可以通过类代码以与代码基无关的方式访问的一些数据(图像、声音、文本等)。并返回资源的URL对象。
public InputStream getResourceAsStream(String name)    返回读取指定资源的输入流。这个方法很重要,可以直接获得jar包中文件的内容。
使用方式,三种方式都可以,最终调用的都是ClassLoader类下的getResourceAsStream()这个方法
  (1)InputStream inputStream=FileUtil.class.getResourceAsStream("e.txt"); //相对路径
  (2)InputStream inputStream=FileUtil.class.getResourceAsStream("/property/e.txt");  //绝对路径
  (3) InputStream inputStream =FileUtil.class.getClassLoader().getResourceAsStream("property/e.txt");
Class类中的方法
public InputStream getResourceAsStream(String name) {
name = resolveName(name);
ClassLoader cl = getClassLoader0();
if (cl==null) {
// A system class.
return ClassLoader.getSystemResourceAsStream(name);
}
return cl.getResourceAsStream(name);
}
ClassLoader类中的方法
public InputStream getResourceAsStream(String name) {
URL url = getResource(name);
try {
return url != null ? url.openStream() : null;
} catch (IOException e) {
return null;
}
}

  

原文地址:https://www.cnblogs.com/shirandedan/p/7490473.html