zoukankan      html  css  js  c++  java
  • 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;
    }
    }

      

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法提高 Torry的困惑(提高型)
    Java实现 蓝桥杯VIP 算法提高 Torry的困惑(提高型)
    Java实现 蓝桥杯VIP 算法提高 Torry的困惑(提高型)
    Java实现 蓝桥杯VIP 算法提高 计算时间
    关于编译器和链接器的一个实验
    Windows下获取逻辑cpu数量和cpu核数量(用GetLogicalProcessorInformation,从XP3才开始有的API)
    计算机底层数据的处理方式(汇编后将所有数据都转化为补码二进制数据,所有类型信息都会消失)
    值得推荐的C/C++框架和库
    Delphi子类调用祖父类的虚函数
    [Framework Design Guideline]
  • 原文地址:https://www.cnblogs.com/shirandedan/p/7490473.html
Copyright © 2011-2022 走看看