0

我希望这是一个直截了当的设计问题。

语境:

我可能正在通过套接字连接下载一对多文件。byte[]从套接字读取它们时,我正在传递s 。我也知道将这些字节写入哪个文件。我将这些字节附加到带有FileOutputStream. 当收到文件的所有字节时,我也会收到通知。

问题:

是否更好:

  1. 保持FileOutputStream打开状态,直到byte收到并写入所有 s
  2. 打开一个新FileOutputStream的,将 s 附加byte到正确的文件中,然后每次都关闭。

2对我来说感觉更安全,因为我会在每次写入后关闭流,以防任何下载出现问题(比如我由于某种原因停止获取字节)。但它似乎也不是很有效。我很难找出打开和关闭FileOutputStreams 的成本。FileOutputStream除了知道何时关闭它需要额外注意之外,保持打开还有其他副作用吗?

提前致谢。

4

2 回答 2

1

您可以通过计算重新打开文件 100 或 1000 次所需的时间来测试重新打开文件的成本。

在我的机器上大约需要 2.1 毫秒,因此如果文件为 750 KB/s 或更高,它可能会减慢文件的下载速度。

如果您有一个不完整的文件,您是想保留它,就好像它没有问题一样,还是宁愿知道该文件已损坏,甚至在无法正确下载时将其删除?

于 2012-12-18T15:50:24.133 回答
0

我同意你的观点,2 更安全,但也比 1 贵得多。

每当您创建 FileOutputStream 时,它都会调用其本机实现的 open() 方法。该方法的实现最终将创建一个文件句柄并向操作系统发出 open() 系统调用。这将至少涉及同步(操作系统级别的文件创建通常是原子的)和可能的一些缓冲区分配,因此它比保持文件句柄打开要昂贵得多。

另一方面,如果使用 1,则存在维护过多打开文件句柄并达到限制的风险(这取决于底层操作系统)。如果您不控制所有错误路径,也不要关闭文件。

我建议评估您将并行打开多少个打开的文件,控制所有错误路径以关闭文件的难度,以及您的服务器所需的吞吐量。根据此类分析的结果,我会选择 1 或 2。

此外,如果你使用 1,你可以实现一些安全网,比如看门狗关闭一些超时没有写入的文件。

于 2012-12-18T16:00:31.587 回答