我在a.properties文件里保存了一些信息,程序启动后修改并保存。
此时本地文件已经更新。但用ResourceBundle.getBundle再读取,取得的仍旧是修改前的内容。
推测是ResourceBundle有缓存机制造成的,问题是ResourceBundle没留清空缓存的接口。
变更其它的读取方法,改动的地方太多。该如何解决。

解决方案 »

  1.   


    clearCache()是哪个类的方法,ResourceBundle没有呵
      

  2.   

    java.util 
    Class ResourceBundle
    java.lang.Objectstatic void clearCache() 
              Removes all resource bundles from the cache that have been loaded using the caller's class loader. 
      

  3.   

    郁闷,我用的是1.5.11没有hmsuccess 所说的方法
      

  4.   

    Java SE 6下缓存 Control 对象的实例
    --------------------------
    装载资源绑定的时候,默认地就会对每个“绑定”检查,判断它是否已经被装载过。我们也可以对此方式作点改变。假如,想在加载一个绑定前,简单地清除掉缓存,可以调用 ResourceBundle类的 clearCache 方法来实现。ResourceBundle.clearCache();
    ResourceBundle myBundle = ResourceBundle.getBundle("com.sun.demo.intl.res.Warnings");甚至能为缓存设置一个“过期”数值来控制缓存的“生存周期”。在 Control 的子类里覆盖方法getTimeToLive ,这个方法返回以毫秒值代表的“生命周期”。缺省情况下,这个方法返回的是预定义的两个值中的一个,这两个值是:TTL_DONT_CACHE 和 TTL_NO_EXPIRATION_CONTROLControl 缺省情况时返回 TTL_NO_EXPIRATION_CONTROL,这个值表示:缓存永不过期。而 TTL_DONT_CACHE 表示:根本就不对绑定进行缓存。假如,想让“绑定”每过4个小时就要进行更新,而且不是重新启动程序的话,那么需要像如下代码那样来覆盖 getTimeToLive 方法:
    public long getTimeToLive() {
    return 4L*60*60*1000; // 14,400,000 milliseconds is four hours.
    }Control 对象里有很多方法来为绑定的搜索和控制进行细致地设置。本文仅列举了其中的一些,其他的,如下所列的方法也可通过覆盖来实现定制:
    * getCandidateLocales
    * getFallbackLocale
    * newBundle
    * needsReload请参阅详细的文档中对这些方法的说明(http://java.sun.com/javase/6/docs/api/java/util/ResourceBundle.Control.html)
      

  5.   

    谢谢先不过我用的是jdk-1_5_0_11-windows-i586-p.exe
    这种情况有解么?
      

  6.   

    这是1.6下的源码,你可以参考参考
     public static final void clearCache() {
    clearCache(getLoader());
        }
    public static final void clearCache(ClassLoader loader) {
    if (loader == null) {
        throw new NullPointerException();
    }
    Set<CacheKey> set = cacheList.keySet();
    for (CacheKey key : set) {
        if (key.getLoader() == loader) {
    set.remove(key);
        }
    }
        }