我希望这是一个直截了当的设计问题。
的上下文: 的
我可能通过套接字连接下载一个到多个文件。当我们从套接字中读取它时,我被传递byte[]
。我也知道要将那些字节写入哪个文件。我将这些字节附加到FileOutputStream
的文件中。当收到文件的所有字节时,我也会收到通知。
的问题: 的
是否更好:
FileOutputStream
开放,直到收到并写入所有byte
FileOutputStream
,将byte
附加到正确的文件中,然后每次都关闭。 2 对我来说更安全,因为我会在每次写入后关闭流,以防出现任何错误(例如我因某种原因停止获取字节)以及任何下载。但它似乎也不是很有效率。我很难找到打开和关闭FileOutputStream
的费用。除了知道什么时候关闭它所需的额外护理之外,还有其他任何副作用使FileOutputStream
保持开放吗?
提前致谢。
答案 0 :(得分:1)
您可以通过计算重新打开文件100或1000次所需的时间来测试重新打开文件的成本。
在我的机器上大约需要2.1毫秒,因此如果文件速度低于750 KB / s,可能会减慢下载速度。
如果您的文件不完整,是否要将其保存为好,或者您是否知道文件已损坏,或者如果文件无法正确下载则删除它?
答案 1 :(得分:0)
我同意你的观点,2更安全,但也比1贵得多。
每当您创建FileOutputStream时,它都会调用其本机实现的open()方法。此方法的实现将最终创建文件句柄并对操作系统发出和open()系统调用。这将至少涉及同步(操作系统级别的文件创建通常是原子的)以及可能是一些缓冲区分配,因此它比保持文件句柄打开要贵得多。
另一方面,如果使用1,则存在过多打开文件句柄并达到限制(取决于底层操作系统)的风险。如果你不控制所有错误路径,也不要关闭文件。
我建议您评估并行打开的打开文件数量,控制关闭文件的所有错误路径以及服务器所需的吞吐量是多么困难。根据这种分析的结果,我会选择1或2.
此外,如果您使用1,您可以实现一些安全网,例如看门狗关闭文件,这些文件在一段时间内没有写入。