Java如何获取静态资源文件路径
Java获取静态资源文件路径
开发中经常会有文件相关的操作,比如说文件的查找,文件的存储。
但是在使用中往往会因为路径问题耽误大量的开发时间。
在实际中常常通过File file = new File(“c://a.txt”)方式来使用,但是切换环境后可能会遇到找不到该资源的问题。
Java中,可以使用getResource()方法来获取资源。
项目工程如下:

1.Class和ClassLoader对于getResouce()的区别?
public class ResourceTest {
@Test
public void test1() {
// /Users/luojiacheng/code/translaction-test/target/test-classes/com/ljc/
System.out.println(ResourceTest.class.getResource("").getPath());
// /Users/luojiacheng/code/translaction-test/target/test-classes/
System.out.println(ResourceTest.class.getResource("/").getPath());
// /Users/luojiacheng/code/translaction-test/target/test-classes/
System.out.println(ResourceTest.class.getClassLoader().getResource("").getPath());
// null
System.out.println(ResourceTest.class.getClassLoader().getResource("/"));
}
}Class:
getResource("")获取的是当前文件的路径;getResouce("/")获取的是classes下的路径,在spring中相当于/WEB-INF/classes/下;
ClassLoader:
getResource("")获取的是classes下的路径,等同于Class.getResource("/");getResouce("/")无法获取。
2.getResourceAsStream()
public InputStream getResourceAsStream(String name) {
URL url = getResource(name);
try {
return url != null ? url.openStream() : null;
} catch (IOException e) {
return null;
}
}getResourceAsStream()其实就是在getReource() + new InputStream()。
3.Class.getResource()实现
public java.net.URL getResource(String name) {
// 获取包路径
name = resolveName(name);
ClassLoader cl = getClassLoader0();
if (cl==null) {
// A system class.
return ClassLoader.getSystemResource(name);
}
// "" -> com/.../ "/" -> ""
return cl.getResource(name);
}Class的getResouce方法实际调用就是ClassLoader的getResource方法,只不过在调用前对文件名进行了额外的处理,将“”转为了包路径,“/”转为了“”。
4.示例
/**
* 无内容返回
*/
@GetMapping("/getTextFromFile")
public String getTextFromFile() throws IOException {
String filePath = MyFileOperation.class.getResource("/a.txt").getPath();
// **.jar!/BOOT-INF/classes!/a.txt
System.out.println(filePath);
File file = new File(filePath);
StringBuilder s = new StringBuilder();
if (file.exists()) {
InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "gbk");
BufferedReader bufferedReader = new BufferedReader(isr);
String str;
while ((str = bufferedReader.readLine()) != null) {
s.append(str);
}
}
return s.toString();
}
/**
* 正确
*/
@GetMapping("/getTextFromFileByStream")
public String getTextFromFileByStream() throws IOException {
StringBuilder s = new StringBuilder();
InputStreamReader isr = new InputStreamReader( MyFileOperation.class.getResourceAsStream("/a.txt"), "gbk");
BufferedReader bufferedReader = new BufferedReader(isr);
String str;
while ((str = bufferedReader.readLine()) != null) {
s.append(str);
}
return s.toString();
}总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
jdk17 SpringBoot JPA集成多数据库的示例详解
这篇文章主要介绍了jdk17 SpringBoot JPA集成多数据库的示例代码,包括配置类、请求拦截器、线程上下文等相关知识,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2023-08-08
Windows系统下Eclipse搭建ESP32编译环境及安装过程
Ecppse 使用了 ESP-IDF 中的 Makefile 支持。这意味着您需要从创建 ESP-IDF 项目开始。您可以使用 github 中的 idf-template 项目,接下来通过本文给大家介绍Windows系统下Eclipse搭建ESP32编译环境及安装过程,感兴趣的朋友一起看看吧2021-10-10
java基于jedisLock—redis分布式锁实现示例代码
这篇文章主要介绍了jedisLock—redis分布式锁实现示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-11-11


最新评论