临时内存中的Java文件

问题描述:

我们有一个内容管理系统,允许我们的用户存储通过REST Web服务上传的文件。在将这些文件存储在存储库之前,它们的内容将被加密。临时内存中的Java文件

检索这些文件时,文件内容被解密,并放入一个字节数组中。其目的是将这些内容作为文件附件传递给客户端,以便将其存储在本地计算机上。

为此,我正在将内容存储到临时文件中,并将临时文件作为附件传回。这种方法具有先前加密的存储库文件的不良副作用,被“清除”存储在临时目录中。

我知道我可以将临时文件设置为当JVM结束时自动删除,但由于这是一台服务器,因此服务器重新启动之间可能会有很长时间。

我也可以(我猜)设置某种侦听器作业来定期检查临时目录并删除超过特定年龄的文件,但这看起来很麻烦并且不能真正解决问题 - 它只是缩短了曝光时间。

我正在寻找替代品来避免临时文件,但仍允许用户通过Web服务作为附件下载(最好在内存中)文件。

有什么想法?

谢谢!

+2

不要使用deleteOnExit - 它仅适用于开发。它会泄漏文件名,直到整个JVM停止。 – bestsss 2011-06-16 15:34:09

嗯,我想你可以将数据存储在Java对象中,例如HashMap并将其用作缓存(使用弱引用,以便在Garbage Collector决定执行此操作时缓存可以收集垃圾)。如果这意味着使用中堆的数量会产生严重后果,那么您可以查看正在运行的memcache或Java等价物,例如ehcache将对象存储在远离JVM堆的地方。

是否有一个原因,你不能只是流结果回来,以便当它完成后它被JVM清理?

+0

这是我希望做的(使用流),但不知道如何通过Http响应来回滚结果。那可能吗? FWIW我使用Restlet作为我的REST WS框架。 – Vinnie 2011-06-16 15:41:48

+0

我想你只是得到了HTTP response.getOutputStream();写信给它,然后刷新它。 – planetjones 2011-06-16 15:44:40

+0

就像将数据流传输到HttpServletRepose输出流一样简单?也许我过了这个想法......谢谢 – Vinnie 2011-06-16 15:46:59

Stream是否是选项?缺点是你将所有内容都存储在内存中。

+0

这就是我希望做的事情,但不知道如何通过Http Response回应结果。那可能吗? FWIW我使用Restlet作为我的REST WS框架。 – Vinnie 2011-06-16 15:39:43

是否有任何理由为什么你必须返回一个File对象,或者这是你可以改变的东西?

我问的原因是,您可以创建一个接口,其中有几个方法,如getName()getContentStream()等,然后将其传回,而不是具体的File对象。

有一件事你可以看看而不是一个文件Memcached并删除该文件,一旦你完成解密它。

此外,您可以将加密文件存储在数据库中作为blob并将其作为流检索。那么你应该能够即时解密它。

难道你不只是保持一个清晰的临时文件的引用,并在加密完成后立即删除它?也许更多地描述你的这个过程是什么在做文件创建?