We use the bdbje (berkeley db, java ed.) cacheloader here which goes to disk as files. It's not one file per cache entry though but rather a rolling set of database files.
You have to be a bit careful about cleanup, but it might be something you can try out.
Both BDBJE and JDBM cache loaders - both file-based - are recommended over the FileCacheLoader.
All cache loaders will have state persisted when state is put or changed in the cache. This could be asynchronous to make cache calls quicker, with the risk associated with any async call.