LocalFileCache 类

182 阅读1分钟
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * use local file as cache.
 */
public class LocalFileCache {
    private static final Logger LOGGER = LoggerFactory.getLogger(LocalFileCache.class);

    private final File file;
    private final long cacheTime;
    private final ReadWriteLock lock = new ReentrantReadWriteLock();

    /**
     * file with cache time in ms
     * @param file - file
     * @param cacheTime - cache time.
     */
    public LocalFileCache(File file, long cacheTime) {
        this.file = file;
        this.cacheTime = cacheTime;
    }

    public String getCacheInfo() {
        // lock before reading cache.
        lock.readLock().lock();
        String result = null;
        try {
            result = FileUtils.readFileToString(this.file, StandardCharsets.UTF_8);
        } catch (IOException ex) {
            LOGGER.error("exception on reading {}", this.file, ex);
        } finally {
            lock.readLock().unlock();
        }
        return result;
    }

    /**
     * write string to cache
     * @param info
     */
    public void writeToCache(String info) {
        lock.writeLock().lock();
        try {
            FileUtils.writeStringToFile(this.file, info, StandardCharsets.UTF_8);
        } catch (IOException ex) {
            LOGGER.error("exception on writing {}", this.file, ex);
        } finally {
            lock.writeLock().unlock();
        }
    }

    /**
     * check whether cache is expired.
     * @return true if cache is expired else false.
     */
    public boolean cacheIsExpired() {
        lock.readLock().lock();
        try {
            return System.currentTimeMillis() - file.lastModified() > cacheTime;
        } finally {
            lock.readLock().unlock();
        }
    }
}