我想知道使用 EndOfStreamException 來檢測 BinaryReader 流的結束是否是一種好習慣> 我不想使用這里建議的 BaseStream.Length 屬性或 PeekChar
C# 檢查檔案的二進制讀取器結尾
因為我必須將它加載到記憶體中(可能是因為它來自 Zip 檔案)并啟用一些標志。相反,這就是我正在做的事情:
using (ZipArchive zipArchive = ZipFile.OpenRead(Filename))
using (BinaryReader fStream = new BinaryReader(zipArchive.Entries[0].Open()))
{
while(true){
try
{
fStream.ReadInt32();
}
catch (EndOfStreamException ex)
{
Log.Debug("End of Binary Stream");
break;
}
}
}
uj5u.com熱心網友回復:
這種方法很好。如果您知道您有一個可搜索的流,您可以將其長度與讀取的位元組數進行比較。請注意, FileStream.Length 不會將整個流加載到記憶體中。
但這種方法適用于任意流。
并且不要擔心在這種情況下使用例外的成本,因為流意味著 IO,而 IO 比例外處理慢幾個數量級。
uj5u.com熱心網友回復:
我認為“最佳實踐”是知道值的數量,例如通過在流前面加上值的數量。這應該允許你像這樣寫
var length = fStream.ReadInt32();
for(var i = 0; i < length-1; i ){
fStream.ReadInt32(); // Skip all values except last
}
return fStream.ReadInt32(); // Last value
首先,這將減少例外處理的需要,如果您在最后一個專案之前到達 endOfStream,您知道流被錯誤地保存,并且有機會處理它,而不是只回傳最后一個可用值。我還發現盡可能少的例外很有幫助,因此您可以使用“break with throw”來運行除錯器,并且對拋出的例外表示實際問題有一定的信心。它還可以讓您將值保存為其他資料的一部分。
如果您無法更改輸入格式,您仍然可以從ZipArchiveEntry.Length獲取條目的未壓縮長度。只需除以sizeof(int)得到值的數量。
在大多數情況下,我也會主張使用序列化庫來保存資料。這往往使將來更改資料格式變得更加容易。
uj5u.com熱心網友回復:
檢查您的程式或初始值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/447763.html
上一篇:IGraphServiceUsersCollectionRequest(GraphServiceClient)的部門非空過濾器
