public class DiskCache extends Object
Note that when a file in the cache is accessed, its lastModified date is set, which is used for the LRU scouring.
The cdm library sometimes needs to write files, eg to uncompress them, or for grib index files, etc. The first choice is to write these files in the same directory that the original file lives in. However, that directory may not be writeable, so we need to find a place to write them to. We also want to use the file if it already exists.
A writeable cache "root directory" is set:
Scenario 1: want to uncompress a file; check to see if already have done so, otherwise get a File that can be written to.
// see if already uncompressed File uncompressedFile = FileCache.getFile(uncompressedFilename, false); if (!uncompressedFile.exists()) { // nope, uncompress it UncompressInputStream.uncompress(uriString, uncompressedFile); } doSomething(uncompressedFile);
Scenario 2: want to write a derived file always in the cache.
File derivedFile = FileCache.getCacheFile(derivedFilename); if (!derivedFile.exists()) { createDerivedFile(derivedFile); } doSomething(derivedFile);
Scenario 3: same as scenario 1, but use the default Cache policy:
File wf = FileCache.getFileStandardPolicy(uncompressedFilename); if (!wf.exists()) { writeToFile(wf); wf.close(); } doSomething(wf);TODO will move in ver 6
Modifier and Type | Field and Description |
---|---|
static boolean |
simulateUnwritableDir
debug only
|
Constructor and Description |
---|
DiskCache() |
Modifier and Type | Method and Description |
---|---|
static void |
cleanCache(Date cutoff,
StringBuilder sbuff)
Remove all files with date < cutoff.
|
static void |
cleanCache(long maxBytes,
Comparator<File> fileComparator,
StringBuilder sbuff)
Remove files if needed to make cache have less than maxBytes bytes file sizes.
|
static void |
cleanCache(long maxBytes,
StringBuilder sbuff)
Remove files if needed to make cache have less than maxBytes bytes file sizes.
|
static File |
getCacheFile(String fileLocation)
Get a file in the cache.
|
static File |
getFile(String fileLocation,
boolean alwaysInCache)
Get a File if it exists.
|
static File |
getFileStandardPolicy(String fileLocation)
Get a File if it exists.
|
static String |
getRootDirectory()
Get the name of the root directory
|
static void |
makeRootDirectory()
Make sure that the current root directory exists.
|
static void |
setCachePolicy(boolean alwaysInCache)
Set the standard policy used in getWriteableFileStandardPolicy().
|
static void |
setRootDirectory(String cacheDir)
Set the cache root directory.
|
static void |
showCache(PrintStream pw) |
public static void cleanCache(Date cutoff, StringBuilder sbuff)
cutoff
- earliest date to allowsbuff
- write results here, null is ok.public static void cleanCache(long maxBytes, Comparator<File> fileComparator, StringBuilder sbuff)
maxBytes
- max number of bytes in cache.fileComparator
- sort files first with thissbuff
- write results here, null is ok.public static void cleanCache(long maxBytes, StringBuilder sbuff)
maxBytes
- max number of bytes in cache.sbuff
- write results here, null is ok.public static File getCacheFile(String fileLocation)
fileLocation
- normal file locationpublic static File getFile(String fileLocation, boolean alwaysInCache)
fileLocation
- normal file locationalwaysInCache
- true if you want to look only in the cachepublic static File getFileStandardPolicy(String fileLocation)
Things are a bit complicated, because in order to guarantee a file in an arbitrary location can be written to, we have to try to open it as a FileOutputStream. If we do, we don't want to open it twice, so we return a WriteableFile that contains an opened FileOutputStream. If it already exists, or we get it from cache, we don't need to open it.
In any case, you must call WriteableFile.close() to make sure its closed.
fileLocation
- normal file locationpublic static String getRootDirectory()
public static void makeRootDirectory()
public static void setCachePolicy(boolean alwaysInCache)
alwaysInCache
- make this the default policypublic static void setRootDirectory(String cacheDir)
cacheDir
- the cache directorypublic static void showCache(PrintStream pw)