使用ClassLoader加载包内的资源

ClassLoader可以把包(jar包,war包)内的class文件加载到 JVM中,第一步就是将class文件以stream的方式读取出来。ClassLoader也将这个加载资源的方法 getResourceAsStream暴露了出来。编程时可以使用这个方法来加载包内的任何资源,比如properties文件,图片等。

使用ClassLoader加载资源文件

当使用ClassLoader加载资源的时候,参数应该是资源文件在包内的路径,不以“/”开头。对于classloader.getres.GetResourceTest包结构存在test.properties文件,

如果要加载test.properties。ClassLoader的getResourceAsStream的参数就是“classloader/getresource/test.properties”。

ClassLoader可以加载任何一个在classpath上存在的资源文件,可以在一个包内,也可以不在一个包内。简单来说,只要把资源文件也当作一个类来看待,把类的全路径名中的“.”换成“/”就可以了。

getResourceAsStream的参数也可以有“..”,用来回到上一层目录。

使用Class加载资源文件

Class类也有一个getResourceAsStream方法。对于同一个包中的资源文件,使用Class加载资源文件会更简单。

比如上例中如果GetResourceTest类想加载相同包下的test.properties,只要使用下面的代码就行了。

GetResourceTest.class.getResourceAsStream(“test.properties”);

Class类也是使用ClassLoader去加载资源的。它所做的事情就是将参数修订成ClassLoader需要的格式。变化都在Class类的resolveName方法中:
  • 对于不是以“/”开头的参数,就认为这个路径是相对于当前类的路径,所以加载当前包中的资源只要写资源文件的名字就可以了。方法最大的一块代码就是为了得到当前类的路径,然后和传进来的相对路径参数拼起来,作为资源文件的绝对路径丢给CL。
  • 对于以“/”开头的参数,就认为参数是资源文件的绝对路径,将这个斜线去掉之后,丢给CL去加载就行了。
 


`cfg.setDirectoryForTemplateLoading` 是FreeMarker模板引擎中的一个方法,用于设置模板加载目录。FreeMarker需要从指定的目录中加载模板文件。在常规的Java Web应用中,这个目录通常是一个文件系统上的路径。但是,在某些情况下,例如在嵌入式或者非文件系统环境下运行的应用(如运行在JAR包内的应用),可能需要使用特殊的文件系统视图来访问资源。 对于加载JAR包内资源,FreeMarker本身并不直接支持从JAR文件内部加载模板文件。通常,需要使用加载器(ClassLoader)的资源访问机制来获取模板文件的内容。这涉及到使用加载器的 `getResource` 或 `getResourceAsStream` 方法来获取资源。一旦获取到资源的输入流,你可以将这个输入流作为模板文件读取,并提供给FreeMarker处理。 这里是一个使用加载器从JAR包内加载资源文件的示例代码片段,这种方式并不会使用到 `cfg.setDirectoryForTemplateLoading` 方法: ```java // 获取类加载ClassLoader classLoader = getClass().getClassLoader(); // 使用加载器获取资源文件的输入流 InputStream inputStream = classLoader.getResourceAsStream("templates/template.ftl"); // 读取输入流中的内容到字符串(这里仅做示例,实际情况可能需要更复杂的处理) String templateContent = IOUtils.toString(inputStream, StandardCharsets.UTF_8); // 假设cfg是FreeMarker配置对象,这里将模板内容以字符串形式设置给FreeMarker cfg.setClassForTemplateLoading(getClass(), ""); cfg.setDefaultEncoding("UTF-8"); cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); // ... 其他配置 ... // 获取模板 Template temp = cfg.getTemplate("template.ftl"); ``` 在这个示例中,我们没有使用`setDirectoryForTemplateLoading`方法,而是使用`setClassForTemplateLoading`方法,它可以接受两个参数:一个是类对象,另一个是类路径下的一个前缀。这允许FreeMarker从一个类的包目录下加载模板,这里我们传入一个空字符串作为前缀。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值