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

      

  • 相关阅读:
    OpenCascade Ray Tracing Rendering
    Create New Commands in Tcl
    OpenCascade Modeling Algorithms Fillets and Chamfers
    OpenCascade Modeling Algorithms Boolean Operations
    Construction of Primitives in Open Cascade
    Open Cascade Data Exchange STL
    Tcl Tk Introduction
    Open Cascade DataExchange IGES
    Netgen mesh library : nglib
    Hello Netgen
  • 原文地址:https://www.cnblogs.com/shirandedan/p/7490473.html
Copyright © 2011-2022 走看看