发布于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黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!