zoukankan      html  css  js  c++  java
  • Java中getResourceAsStream的用法

    Java中getResourceAsStream的用法

    [转载]class.getResource()的用法

    用JAVA获取文件,听似简单,但对于很多像我这样的新人来说,还是掌握颇浅,用起来感觉颇深,大常最经常用的,就是用JAVA的File类,如要取得c:/test.txt文件,就会这样用File file = newFile("c:/test.txt");这样用有什么问题,相信大家都知道,就是路径硬编码,对于JAVA精神来说,应用应该一次成型,到处可用,并且从现实应用来讲,最终生成的应用也会部署到Windows外的操作系统中,对于linux来说,在应用中用了c:/这样的字样,就是失败,所以,我们应该尽量避免使用硬编码,即直接使用绝对路径。 

      在Servlet应用中,有一个getRealPath(String str)的方法,这个方法尽管也可以动态地获得文件的路径,不秘直接手写绝对路径,但这也是一个不被建议使用的方法,那么,我们有什么方法可以更好地获得文件呢? 

          那就是Class.getResource()与Class.getResourceAsStream()方法,但很多人还是不太懂它的用法,因为很多人(比如不久前的我)都不知道应该传怎么样的参数给它,当然,有些人己经用得如火纯青,这些人是不需要照顾的,在此仅给不会或者还不是很熟的人解释一点点。 


    比如我们有以下目录 
    |--project 
         |--src 
             |--javaapplication 
                 |--Test.java 
                 |--file1.txt 
             |--file2.txt 
         |--build 
             |--javaapplication 
                 |--Test.class 
                 |--file3.txt 
             |--file4.txt 

    在上面的目录中,有一个src目录,这是JAVA源文件的目录,有一个build目录,这是JAVA编译后文件(.class文件等)的存放目录 
    那么,我们在Test类中应该如何分别获得 
    file1.txt file2.txt file3.txt file4.txt这四个文件呢? 

    首先讲file3.txt与file4.txt 
    file3.txt: 
    方法一:File file3 = new File(Test.class.getResource("file3.txt").getFile()); 
    方法二:File file3 = new File(Test.class.getResource("/javaapplication/file3.txt").getFile()); 
    方法三:File file3 = new File(Test.class.getClassLoader().getResource("javaapplication/file3.txt").getFile()); 

    file4.txt: 
    方法一:File file4 = new File(Test.class.getResource("/file4.txt").getFile()); 
    方法二:File file4 = new File(Test.class.getClassLoader().getResource("file4.txt").getFile()); 

    很好,我们可以有多种方法选择,但是file1与file2文件呢?如何获得? 
    答案是,你只能写上它们的绝对路径,不能像file3与file4一样用class.getResource()这种方法获得,它们的获取方法如下 
    假如整个project目录放在c:/下,那么file1与file2的获取方法分别为 
    file1.txt 
    方法一:File file1 = new File("c:/project/src/javaapplication/file1.txt"); 
    方法二:。。。没有 

    file2.txt 
    方法一:File file2 = new File("c:/project/src/file2.txt"); 
    方法二:。。。也没有 

    总结一下,就是你想获得文件,你得从最终生成的.class文件为着手点,不要以.java文件的路径为出发点,因为真正使用的就是.class,不会拿个.java文件就使用,因为java是编译型语言嘛 

    至于getResouce()方法的参数,你以class为出发点,再结合相对路径的概念,就可以准确地定位资源文件了,至于它的根目录嘛,你用不同的IDEbuild出来是不同的位置下的,不过都是以顶层package作为根目录,比如在Web应用中,有一个WEB-INF的目录,WEB-INF目录里面除了web.xml文件外,还有一个classes目录,没错了,它就是你这个WEB应用的package的顶层目录,也是所有.class的根目录“/”,假如clasaes目录下面有一个file.txt文件,它的相对路径就是"/file.txt",如果相对路径不是以"/"开头,那么它就是相对于.class的路径。。 

    还有一个getResourceAsStream()方法,参数是与getResouce()方法是一样的,它相当于你用getResource()取得File文件后,再new InputStream(file)一样的结果 

       

    class.getResource("/") --> 返回class文件所在的顶级目录,一般为包名的顶级目录。 --> file:/home/duanyong/workspace/cxxx/xxxx/bin/WEB-INF/classes/ 
    class.getResource("/xxx.txt") --> 返回顶级目录下的xxx.txt路径。 file://..../bin/WEB-INF/classes/xxx.txt 

    getResource(String path),path是以class文件的顶级目标所在的相对路径。如果顶级目录为classes,在classes/xxx/yyy.txt这样一个文件。取得yyy.txt的语法为:class.getResource("/xxx/yyy.txt"); 

    示例代码: 
    查看复制到剪切板打印

    1. //取得classes顶级目录下的/xxx/yyy.txt文件   

    2. System.out.println(Test.class.getResource("/xxx/yyy.txt"));   

    3. //取得本class的上路径   

    4. System.out.println(Test.class.getResource(Test.class.getSimpleName() + ".class"));          

    Java代码  

    1. //取得classes顶级目录下的/xxx/yyy.txt文件  

    2. System.out.println(Test.class.getResource("/xxx/yyy.txt"));  

    3. //取得本class的上路径  

    4. System.out.println(Test.class.getResource(Test.class.getSimpleName() + ".class"));          




    结果: 
    file:/home/duanyong/workspace/test/bin/WEB-INF/classes/xxx/yyy.txt 
    file:/home/duanyong/workspace/test/bin/WEB-INF/classes/cn/duanyong/test/Test.class 

     

     

     

     

     

    首先,Java中的getResourceAsStream有以下几种: 
    1. Class.getResourceAsStream(String path) : path 不以’/'开头时默认是从此类所在的包下取资源,以’/'开头则是从ClassPath根下获取。其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。 

    2. Class.getClassLoader.getResourceAsStream(String path) :默认则是从ClassPath根下获取,path不能以’/'开头,最终是由ClassLoader获取资源。 

    3. ServletContext. getResourceAsStream(String path):默认从WebAPP根目录下取资源,Tomcat下path是否以’/'开头无所谓,当然这和具体的容器实现有关。 

    4. Jsp下的application内置对象就是上面的ServletContext的一种实现。 

    其次,getResourceAsStream 用法大致有以下几种: 

    第一: 要加载的文件和.class文件在同一目录下,例如:com.x.y 下有类me.class ,同时有资源文件myfile.xml 

    那么,应该有如下代码: 

    me.class.getResourceAsStream("myfile.xml"); 

    第二:在me.class目录的子目录下,例如:com.x.y 下有类me.class ,同时在 com.x.y.file 目录下有资源文件myfile.xml 

    那么,应该有如下代码: 

    me.class.getResourceAsStream("file/myfile.xml"); 

    第三:不在me.class目录下,也不在子目录下,例如:com.x.y 下有类me.class ,同时在 com.x.file 目录下有资源文件myfile.xml 

    那么,应该有如下代码: 

    me.class.getResourceAsStream("/com/x/file/myfile.xml"); 

    总结一下,可能只是两种写法 

    第一:前面有 “   / ” 

    “ / ”代表了工程的根目录,例如工程名叫做myproject,“ / ”代表了myproject 

    me.class.getResourceAsStream("/com/x/file/myfile.xml"); 

    第二:前面没有 “   / ” 

    代表当前类的目录 

    me.class.getResourceAsStream("myfile.xml"); 

    me.class.getResourceAsStream("file/myfile.xml"); 

    最后,自己的理解: 
    getResourceAsStream读取的文件路径只局限与工程的源文件夹中,包括在工程src根目录下,以及类包里面任何位置,但是如果配置文件路径是在除了源文件夹之外的其他文件夹中时,该方法是用不了的。

  • 相关阅读:
    linux 命令——19 find (转)
    linux 命令——18 locate (转)
    linux 命令——17 whereis(转)
    linux 命令——16 which(转)
    linux 命令——15 tail (转)
    linux 命令——14 head (转)
    Java for LeetCode 038 Count and Say
    Java for LeetCode 037 Sudoku Solver
    Java for LeetCode 036 Valid Sudoku
    Java for LeetCode 035 Search Insert Position
  • 原文地址:https://www.cnblogs.com/handsome1013/p/7404355.html
Copyright © 2011-2022 走看看