2012-12-18 29 views
0

我希望這是一個直截了當的設計問題。收到每個數據包的新FileOutputStream?或保持FileOutputStream打開?

語境:

我可以下載一個通過套接字連接多個文件。從插座讀取它時,我正在通過byte[]。我也知道哪些文件要寫入這些字節。我將這些字節附加到FileOutputStream的文件中。我也會收到一個文件的所有字節的通知。

問:

是更好地:

  1. 保持FileOutputStream開放,直到所有byte■找收到並書面
  2. 打開一個新FileOutputStream是追加byte小號在接收到正確的文件後,每次關閉。

感覺更安全,因爲我將與任何下載關閉流後的情況下,每個寫東西出了問題(像我停止獲取字節出於某種原因)。但它似乎不是很有效率。我很難找出開啓和關閉FileOutputStream s是多麼昂貴。除了知道何時關閉它需要額外的護理之外,是否還有任何其他的副作用會使FileOutputStream開放?

在此先感謝。

回答

0

我同意你說的2是安全的,但也更加昂貴比1

只要你創建一個FileOutputStream,它所謂的原生實現的open()方法。這個方法的實現將最終創建一個文件句柄併發布和打開()系統調用到操作系統。這將至少涉及同步(操作系統級別的文件創建通常是原子),可能還有一些緩衝區分配,因此它將比保持文件句柄打開更爲昂貴。另一方面,如果使用1,則有可能獲得太多打開文件句柄並達到極限(這取決於底層操作系統)。如果你不控制所有錯誤路徑,也不關閉文件。

我建議您評估您將並行打開多少個打開的文件,控制所有錯誤路徑以關閉文件的難度以及服務器所需的吞吐量。根據這種分析的結果,我會選擇1或2。

此外,如果你使用1,你可以實現一些安全的網絡,比如看門狗關閉文件,這些文件沒有被寫入超時。

+0

感謝您解決保持信息流暢通的風險。正如你所建議的那樣,我認爲使用超時看門狗將是我走的路。 – sethro

+0

如果在完成.close()流之後如何將該變量設置爲null,那又如何呢?然後他創建一個新的....更安全,@izaera? – gumuruh

1

您可以通過計算重新打開文件所需的時間(比如說100或1000次)來測試重新打開文件的開銷。

在我的機器上大約需要2.1 ms,因此如果文件在750 KB/s或更高,它可能會減慢文件的下載速度。

如果你有一個不完整的文件,你想保持它好像它是好的,或者你寧願知道該文件已損壞,甚至刪除它,如果它不能正確下載?