我正在编写一个Webapp(SpringMVC + JSF),允许用户上传文件并与他人编辑/共享。在此应用程序的服务层上,我使用guava处理所有文件IO,但不幸的是,到目前为止,从参考手册中可以看到,guava不能解决并发访问文件的问题。
我知道Java提供的FileChannel类有一个可在某种程度上解决此问题的锁定方法,但它与guava IO框架不太匹配。在摆脱番石榴并使用FileChannel和InputStream重写代码之前,我想知道是否还有其他方法可以完全不用切换到另一个IO包。
(将文件名映射到锁的大型哈希表对我来说似乎不是一个好的解决方案。当用户群很大时,内存中将存储太多。)
最佳答案
使用数据库。文件系统非常适合存储实际的文件内容-但是对于存储和管理用户,文件详细信息,共享以及编辑和版本历史记录等,绝对需要数据库。
为了避免由于上传失败而造成的信息丢失,例如,上传和编辑需要转到一个新文件,而不是覆盖现有文件,并且可能会将其丢弃。
编辑和共享也可能是针对某个实体(可能是“ DOCUMENT”表中的一行),该实体可能具有连续的版本(磁盘上的实际文件)。
因此,出于至少两个原因,“文件系统文件”与您需要跟踪的实体以及用户希望使用的实体是不同的。
如果假定的用户群确实很大,他们可能会希望有一个真正的应用程序。有了可靠的数据库,记录用户访问权限,文档版本,共享以及磁盘上基础文件的位置和锁定状态变得容易且可靠。
没有这样的数据库,就不可能可靠地做。
关于java - 并发访问Webapp中文件的最佳解决方案,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15754086/