缓存文件输入流
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 **/
}
您可以使用 counter
或 CachedFile
来删除在一定时间后或堆内存非常低时很少使用的文件。
在我的程序中,我重复读取许多这样的文件:
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 **/
}
您可以使用 counter
或 CachedFile
来删除在一定时间后或堆内存非常低时很少使用的文件。