java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java获取静态资源文件路径

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

作者:蜡笔没了小新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:

ClassLoader:

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();
    }

总结

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

您可能感兴趣的文章:
阅读全文