Java如何获取静态资源文件路径

 更新时间:2023年06月15日 15:48:31   作者:蜡笔没了小新git  
这篇文章主要介绍了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();
    }

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java中EnumMap的使用解析

    Java中EnumMap的使用解析

    这篇文章主要介绍了Java中EnumMap的使用解析,EnumMap 是一种特殊的 Map,它要求自身所有的键来自某个枚举类型,EnumMap 的内部可以作为一个数组来实现,因此它们的性能非常好,你可以放心地用 EnumMap 来实现基于枚举的查询,需要的朋友可以参考下
    2023-11-11
  • 我从jdk1.8升级到jdk11所遇到的坑都有这些

    我从jdk1.8升级到jdk11所遇到的坑都有这些

    这篇文章主要介绍了从jdk1.8升级到jdk11将会遇到的一些坑,本文给大家分享解决方案对大家的学习或工作具有参考借鉴价值,对jdk1.8升级到jdk11相关知识感兴趣的朋友,快来看看吧
    2021-08-08
  • Java如何获取数组和字符串的长度(length还是length())

    Java如何获取数组和字符串的长度(length还是length())

    这篇文章主要介绍了Java如何获取数组和字符串的长度(length还是length()),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • Mabitis中的#与$符号区别及用法介绍

    Mabitis中的#与$符号区别及用法介绍

    这篇文章主要介绍了Mabitis中的#与$符号区别,需要的朋友可以参考下
    2017-02-02
  • java调用百度定位api服务获取地理位置示例

    java调用百度定位api服务获取地理位置示例

    java调用百度定位api服务获取地理位置示例,大家参考使用吧
    2013-12-12
  • Java实现跳转到指定页面的方法小结

    Java实现跳转到指定页面的方法小结

    在Java中,实现页面跳转主要涉及到Web开发,而这通常通过使用Java的Web框架(如Servlet、Spring MVC)来完成,下面讲解一下如何在不同的Java Web框架中实现页面跳转,文中有详细的代码示例供大家参考,需要的朋友可以参考下
    2024-05-05
  • Java多线程start()方法原理解析

    Java多线程start()方法原理解析

    这篇文章主要介绍了Java多线程start()方法原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • SpringBoot的java -jar命令启动原理解读

    SpringBoot的java -jar命令启动原理解读

    这篇文章主要介绍了SpringBoot的java -jar命令启动原理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • Android中Parcelable的作用实例解析

    Android中Parcelable的作用实例解析

    这篇文章主要介绍了Android中Parcelable的作用,对于Android初学者有一定的参考学习价值,需要的朋友可以参考下
    2014-08-08
  • Java基础之反射详解

    Java基础之反射详解

    这篇文章主要介绍了教你怎么通过IDEA设置堆内存空间,文中有非常详细的代码示例,对正在使用IDEA的小伙伴们很有帮助哟,需要的朋友可以参考下
    2021-05-05

最新评论