【发布时间】:2013-05-23 07:49:57
【问题描述】:
我可以看到有很多关于重用 InputStream 的帖子。我了解InputStream 是一次性的,不能重复使用。
但是,我有一个这样的用例:
我通过使用DropBox's Java SDK 获取DropBoxInputStream 从DropBox 下载了文件。然后我需要通过传递InputStream 将文件上传到另一个系统。但是,作为下载的一部分,我必须提供文件的MD5。所以我必须在上传文件之前从流中读取文件。因为我收到的DropBoxInputStream只能使用一次,所以在我计算完MD5之后,上传文件之前,我必须再得到一个DropBoxInputStream。过程如下:
- 获取第一个 DropBoxInputStream
- 从 DropBoxInputStream 读取并计算 MD5
- 获取第二个 DropBoxInputStream
- 使用 MD5 和第二个 DropBoxInputStream 上传文件。
我在想,如果在计算MD5 之前我有很多方法可以“缓存”或“备份”InputStream,这样我就可以节省再次获得相同DropBoxInputStream 的第3 步?
非常感谢
编辑:
抱歉,我错过了一些信息。
我目前正在做的是使用MD5DigestOutputStream 来计算MD5。我通过MD5DigestOutputStream 流式传输数据并将它们保存为本地临时文件。一旦数据通过MD5DigestOutputStream,它将计算MD5。
然后我调用第三方库使用计算出的 md5 和从临时文件读取的 FileInputStream 上传文件。
但是,有时这需要巨大的磁盘空间,我想消除使用临时文件的需要。我使用的库只接受MD5 和InputStream。这意味着我必须最终计算MD5。我的计划是使用我的MD5DigestOutputStream 将数据写入/dev/null(不保留文件),以便我可以计算MD5,并再次从DropBox 获取InputStream 并将其传递给我使用的库。我假设库将能够直接从DropBox 获取文件,而无需我将文件缓存在磁盘的内存中。它会起作用吗?
【问题讨论】:
-
我已经得到了改进的计划。我确实得到了两次 InputStream,但性能还不错。通过这种方式,我不需要文件系统参与下载/上传过程。谢谢大家。