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;
}
}