程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

.getClassLoader().getResourceAsStream(path) 缓存结果

发布于2021-08-21 08:04     阅读(1193)     评论(0)     点赞(21)     收藏(1)


我在 servlet 加载文件,使用 .getClassLoader().getResourceAsStream(path),路径在 WEB-INF/classes 目录中,我更改路径文件内容后发现,但文件 servlet 加载是相同的,不要更改, 文件被缓存。

示例代码:

在我更改 test.key 内容后,此方法每次总是得到相同的结果

private String getKey(String param){
    String name = "keys/"+param+"/test.key";
    InputStream in = XXXServlet.class.getClassLoader().getResourceAsStream(name);
    StringBuilder builder = new StringBuilder();
    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        String line = null;
        while((line = reader.readLine()) != null){
            builder.append(line).append("\n");
        }
    } catch (IOException ignoreException) {

    }finally{
        try {
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    String result = builder.toString();
    return result;
}

================================================== ================

更改这两行代码,它工作正常

    String name = "/WEB-INF/classes/keys/"+param+"/test.key";
    InputStream in = getServletContext().getResourceAsStream(name);

解决方案


安库尔是对的。如果名称和相关内容已经由类加载器或其父级加载一次,则尝试获取类或资源(无论文件/输入流的名称和路径如何)的现有类加载器将永远不会重新加载。这是出于性能原因。唯一的方法是创建一个类加载器的新实例,然后再做一次。但是,至少对于类,您将不得不担心系统中一起运行的不兼容类。就像您不能将新类的实例分配给由第一个类加载器实例加载的类键入的变量,因为它们在技术上是不同的类。

Pabrantes 认为这是不同的,因为 Liu 不是在加载一个“类”,而是一个键:"keys/"+param+"/test.key"; 但是,他使用类加载器来执行此操作,并且关于 getResourceAsStream(name) 加载“名称”的规则是相同的。不管它是否是一个类,类加载器都会认为“哦,你去吧,我已经加载了 'name' 的字节流”。把它从 permgen 中拉出来。对于那些感兴趣的人——如果你创建/实现你自己的每次重新加载的新类加载器版本——只需确保它只对非常特定的路径或名称模式执行此操作。还要记住,您加载的每个副本都可能在 permgen 中获得空间,因此随着时间的推移, permgen 将失去控制,除非您卸载。

所以 - 这就是它不起作用的原因。ContextLoader 很好用。:-)

丹 C.



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:http://www.javaheidong.com/blog/article/268337/805a3cf25a6a6e88b9eb/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

21 0
收藏该文
已收藏

评论内容:(最多支持255个字符)