X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Futils%2FCache.java;h=ff2859eb44403062a5186abd78aa0233316a4926;hb=7194ac50b29064a013f177fc9cfc5aaa131a8ec4;hp=13a50ea92219663a379eb58d7956237217a3f49a;hpb=0988831f084e27de9927c1bb29e338e9263bfa42;p=nikiroo-utils.git diff --git a/src/be/nikiroo/utils/Cache.java b/src/be/nikiroo/utils/Cache.java index 13a50ea..ff2859e 100644 --- a/src/be/nikiroo/utils/Cache.java +++ b/src/be/nikiroo/utils/Cache.java @@ -1,13 +1,14 @@ package be.nikiroo.utils; import java.io.File; -import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.Date; +import be.nikiroo.utils.streams.MarkableFileInputStream; + /** * A generic cache system, with special support for {@link URL}s. *

@@ -158,7 +159,16 @@ public class Cache { * @return the number of cleaned items */ public int clean(boolean onlyOld) { - return clean(onlyOld, dir); + long ms = System.currentTimeMillis(); + + tracer.trace("Cleaning cache from old files..."); + + int num = clean(onlyOld, dir, -1); + + tracer.trace(num + "cache items cleaned in " + + (System.currentTimeMillis() - ms) + " ms"); + + return num; } /** @@ -169,16 +179,23 @@ public class Cache { * resources * @param cacheDir * the cache directory to clean + * @param limit + * stop after limit files deleted, or -1 for unlimited * * @return the number of cleaned items */ - private int clean(boolean onlyOld, File cacheDir) { + private int clean(boolean onlyOld, File cacheDir, int limit) { int num = 0; File[] files = cacheDir.listFiles(); if (files != null) { for (File file : files) { + if (limit >= 0 && num >= limit) { + return num; + } + if (file.isDirectory()) { - num += clean(onlyOld, file); + num += clean(onlyOld, file, limit); + file.delete(); // only if empty } else { if (!onlyOld || isOld(file, true)) { if (file.delete()) { @@ -220,8 +237,9 @@ public class Cache { * @param allowTooOld * allow files even if they are considered too old * @param stable - * a stable file (that dones't change too often) -- parameter - * used to check if the file is too old to keep or not + * a stable file (that doesn't change too often) -- parameter + * used to check if the file is too old to keep or not in the + * cache * * @return the opened resource if found, NULL if not */ @@ -246,7 +264,7 @@ public class Cache { if (cached.exists() && cached.isFile() && (allowTooOld || !isOld(cached, stable))) { try { - return new MarkableFileInputStream(new FileInputStream(cached)); + return new MarkableFileInputStream(cached); } catch (FileNotFoundException e) { return null; } @@ -290,6 +308,8 @@ public class Cache { /** * Save the given resource to the cache. + *

+ * Will also clean the {@link Cache} from old files. * * @param in * the input data @@ -300,7 +320,9 @@ public class Cache { * in case of I/O error */ private void save(InputStream in, File cached) throws IOException { + // We delete AFTER so not to remove the subdir we will use... IOUtils.write(in, cached); + clean(true, dir, 10); } /**