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

      

  • 相关阅读:
    数据库的查询笔记
    数据库设计第3级的阶梯:构建表
    数据库使用学习笔记
    index()
    面向对象写法的拖拽
    js面向对象
    laytpl.js 模板使用记录
    面试总结
    JS的基础类型与引用类型
    jQuery两种扩展插件的方式
  • 原文地址:https://www.cnblogs.com/shirandedan/p/7490473.html
Copyright © 2020-2023  润新知