缓存文件输入流

Caching FileInputStream

在我的程序中,我重复读取许多这样的文件:

String myLetter = "CoverSheet.rtf"; // actually has a full path
FileInputStream in = new FileInputStream(myLetter);
letterSection.importRtfDocument(in);
in.close();

由于importRtfDocument要添加到文档中的小文件很多,运行要生成几千个字母,所以处理速度很慢。

importRtfDocument 方法来自我正在使用的库,需要给定一个 FileInputStream。这就是我难过的地方。我尝试了一些方法,例如为 class 中的每个文件声明一个 FileInputStream 并保持它们打开 - 但不支持 reset()

我看过其他类似的问题:

How to Cache InputStream for Multiple Use

然而,none 似乎解决了我的问题,也就是说,我如何缓存 FileInputStream

我通常创建自己的池来缓存文件。只需考虑以下简单代码:

class CachedPool {
    private Map<URI, CachedFile> pool = new HashMap<>();

    public CachedPool(){
    }

    public <T> T getResource(URI uri) {
        CachedFile file;
        if(pool.containsKey(uri)){
            file = pool.get(uri);
        } else {
            file = new CachedFile(uri);   // Injecting point to add resources
            pool.put(uri, file);
        }
        return file.getContent();
    }
}

class CachedFile {
    private URI uri;
    private int counter;
    private Date cachedTime;
    private Object content;

    public CachedFile(URL uri){
        this.url = uri;
        this.content = uri.toURL().getContent();
        this.cachedTime = new Date();
        this.counter = 0;
    }

    public <T> T getContent(){
        counter++;
        return (T) content;
    }

    /** Override equals() and hashCode() **/
    /** Write getters for all instance variables **/
}

您可以使用 counterCachedFile 来删除在一定时间后或堆内存非常低时很少使用的文件。