java中资源的定位

java中的资源

操作系统中的文件一般都叫做资源,例如图片、文本文件、视频、音频等等。在java平台中获取这些文件或者定位这些文件可以通过java语言本身的一些API,例如File、InputStream、OutputStream等等。

在java平台中如果直接通过文件系统API来定位文件会比较不灵活,为了方便起见java平台可以结合操作系统的环境变量以及jvm参数来设置一些特定的资源位置,利用这些参数,再对文件系统的API进行封装,为用户提供一些更为简单方便的资源定位的API 。例如Class对象中的getResource()方法或者类加载器中的getResource()方法。

Class对象的getResource(“”)方法,获取到的是当前类所在的目录,如果参数是"/"即getResource("/")获取的是类路径(当前类加载器要加载的类所在的路径)

类加载器的getResource("")方法,获取的是当前类加载器要加载的类所在的路径,如果类加载器的getResource("/"),返回的是null

 

在资源定位时,还可以使用java中的URL类,这个类不仅仅可以定位本地文件系统中的资源,还可以定位网络中的资源。根据不同资源定位处理器,可以根据不同的协议处理不同的资源。

一般支持的协议有   file:  http:/https:  jar:  等协议。

获取资源位置 

public static void showURL() throws IOException {

         /**
          * Class类的getResource()
          * 第一种:获取类加载的根路径   D:\workspace\algorithm-pro\target\classes
          */
         File f = new File(URLReadJar.class.getResource("/").getPath());
         System.out.println(f);

         /**
          * Class类的getResource()
          * 获取当前类的所在工程路径; 如果不加“/”  获取当前类的加载目录  D:\workspace\algorithm-pro\target\classes\com\resource\location
          */
         File f2 = new File(URLReadJar.class.getResource("").getPath());
         System.out.println(f2);

         /**
          * 第二种:获取项目路径    D:\workspace\algorithm-pro
          * 也可以采用System中的getPropertry("user.dir")获取项目路径
          */
         File directory = new File("");// 参数为空
         String courseFile = directory.getCanonicalPath();
         System.out.println(courseFile);

 
         
        /**
         * 类加载器的的getResource()
         * 第三种: file:/D:/workspace/algorithm-pro/target/classes/
         *  注意此处用的是 类加载器 的getResource(),获取的是当前类加载器的工作目录
         *  URLReadJar的类加载器,其实就是应用程序类加载器,也叫系统类加载器。
         */
         URL xmlpath = URLReadJar.class.getClassLoader().getResource("");
         System.out.println(xmlpath);

 
          
         /**
          * 结果:D:\workspace\algorithm-pro
          * 获取当前工程路径
          */
         System.out.println(System.getProperty("user.dir"));
         

         /**
          *  获取所有的类路径 包括jar包的路径 D:\workspace\algorithm-pro\target\classes
          */
         System.out.println(System.getProperty("java.class.path"));
         


     }
     

 

配置文件中的classpath与classpath*的区别


无论是maven项目还是普通的java工程都会有个src目录,这个目录中存放着项目的java文件和配置文件。web项目src目录下的文件在编译后会放到WEB-INF/classes,非web项目src目录下的文件在编译后会放到classes/。classpath所对应的路径指的就是WEB-INF/classes(或者classes/)
classpath 和 classpath* 区别:
classpath:只会到你的class路径中查找找文件;
classpath*:不仅包含class路径,还包括jar文件中(class路径)进行查找.

用classpath*:需要遍历所有的classpath,所以加载速度是很慢的,因此,在规划的时候,应该尽可能规划好资源文件所在的路径,尽量避免使用 classpath*


参考:
https://www.jianshu.com/p/0dd322e51516
posted @ 2020-11-28 16:00  阿瞒123  阅读(248)  评论(0)    收藏  举报