2015-11-17 4 views
1

В моей программе я неоднократно читал несколько файлов, как это:Кэширование FileInputStream

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

Поскольку есть много маленьких файлов, которые являются компонентами для добавления в документ с importRtfDocument, и тысяч писем, порождающими в прогон, обработка выполняется довольно медленно.

Метод importRtfDocument исходит из библиотеки, которую я использую, и ей необходимо дать FileInputStream. Вот где я в тупике. Я пробовал несколько вещей, например, объявляя FileInputStream для каждого файла в классе и сохраняя их открытыми, но reset() не поддерживается.

Я посмотрел на другие подобные вопросы, как этот:

How to Cache InputStream for Multiple Use

Однако никто не кажется, для решения моей проблемы, а именно, как я могу кэшировать FileInputStream?

ответ

2

Обычно я создаю свой собственный пул для кэширования файлов. Просто рассмотрим следующий простой код:

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 для удаления файлов, которые редко используются по истечении определенного периода времени или при динамической памяти является очень низким.

+0

Ваш ответ многообещающий. Кроме того, Turophile должен создать подкласс FileInputStream для подачи библиотеки, которую он использует из кеша, не так ли? – IzCe

+0

Спасибо, я постараюсь работать в этом коде. – Turophile