【问题标题】:Temporary, in memory, files in JavaJava中的临时文件,在内存中
【发布时间】:2011-06-16 15:18:01
【问题描述】:

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

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

为此,我目前将内容存储到临时文件中,并将临时文件作为附件传回。这种方法具有先前加密的存储库文件的令人讨厌的副作用,即“明文”存储在临时目录中。

我知道我可以将临时文件设置为在 JVM 结束时自动删除,但由于这是一个服务器,服务器重新启动之间可能需要很长时间。

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

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

有什么想法吗?

谢谢!

【问题讨论】:

  • 不要使用 deleteOnExit - 它仅对开发有用。它会泄漏文件名,直到整个 JVM 停止。

标签: java web-services rest content-management


【解决方案1】:

我猜你可以将数据存储在 Java 对象中,例如HashMap 并将其用作缓存(使用弱引用,以便在垃圾收集器决定这样做时缓存可以收集垃圾)。如果这对使用中的堆数量意味着可怕的后果,那么您可以查看运行 memcache 或 Java 等价物,例如ehcache 将您的对象存储在 JVM 堆之外。

您是否有理由不能直接将结果流回,以便在完成后被 JVM 清理?

【讨论】:

  • 这是我希望做的事情(使用流),但不知道如何通过 Http 响应将结果返回。那可能吗? FWIW 我使用 Restlet 作为我的 REST WS 框架。
  • 我想你会得到 HTTP response.getOutputStream();写入它然后刷新它。
  • 就像将字节流式传输到 HttpServletRepose 输出流一样简单?也许我想多了……谢谢
  • 是的,您只需要一个 FileInputStream 来读取您的文件,然后将该流写入 HTTP 响应的 OutputStream。让我们知道您的进展情况。
【解决方案2】:

Streams 可以选择吗?缺点是您将所有内容都存储在内存中。

【讨论】:

  • 这是我希望做的,但不知道如何通过 Http Response 将结果返回。那可能吗? FWIW 我使用 Restlet 作为我的 REST WS 框架。
【解决方案3】:

您是否有任何理由必须将 File 对象传回,或者这是否可以更改?

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

【讨论】:

    【解决方案4】:

    你能不能只保留对清除临时文件的引用并在加密完成后立即删除它?也许将您围绕此的更多过程描述为文件创建的内容?

    【讨论】:

      【解决方案5】:

      您可以查看 Memcached 而不是文件,并在完成解密后删除该文件。

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

      【讨论】:

        猜你喜欢
        • 2011-06-28
        • 2015-05-12
        • 1970-01-01
        • 2011-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-04
        • 2010-10-07
        相关资源
        最近更新 更多