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:workspacealgorithm-pro argetclasses */ File f = new File(URLReadJar.class.getResource("/").getPath()); System.out.println(f); /** * Class类的getResource() * 获取当前类的所在工程路径; 如果不加“/” 获取当前类的加载目录 D:workspacealgorithm-pro argetclassescom esourcelocation */ File f2 = new File(URLReadJar.class.getResource("").getPath()); System.out.println(f2); /** * 第二种:获取项目路径 D:workspacealgorithm-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:workspacealgorithm-pro * 获取当前工程路径 */ System.out.println(System.getProperty("user.dir")); /** * 获取所有的类路径 包括jar包的路径 D:workspacealgorithm-pro argetclasses */ 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