1

[これはニシンです。人々の時間を無駄にして申し訳ありません。情報は他の誰かに役立つかもしれませんが.]

を介してテキストを簡単に読み取るために、StreamReader をラップしたカスタム メモリ ストリームがありますReadToEnd()。問題は、決して終わらないことです。関数を継続的に呼び出してReadByte()おり、返される値はすべて実際の値である可能性があるためRead()、データの終わりを示すためにゼロを返すことができる関数とは異なり、ここで立ち往生しています。の仕様でReadByte()は、データの最後に -1 を返すと書かれていますが、それによって停止することはありませんReadToEnd()。だとしたらかなり駄目です。

ドキュメントで見つけることができるのは、「ReadToEnd は、ストリームがいつ終了したかを認識していると想定している」ということだけです。しかし、ストリームがその状態をどのように通知するかわかりません。

ストリームの最後に到達したときに例外がスローされた場合ReadByte()、例外が StreamReader によってキャッチされないため、出力を割り当てている変数が設定されることはありません。では、ストリームの終わりに到達したことを伝えるために、その下のストリームからどのような条件を探しているのでしょうか?


すべてのコメントともう少し掘り下げた後、問題は私が忘れていた中間ストリームであることが判明しましたread()。サブストリームを呼び出しreadbyte、返されたデータを配列に書き込んでいました。コメントの 1 つのおかげで、配列への書き込みを続行するか終了するかを決定するために、最初に int を変数に読み取って、それが byte -1 ではなく int -1 であるかどうかを確認できることを発見したときデータがなくなったからです。

したがって、私の質問に対する答えは、シグナルは Read() がゼロを返すことであり、ReadByte がどこかで呼び出されているのを見たら、それが疑いを持ち始める場所だということです。

4

2 に答える 2

1

カスタム実装を作成する場合は、の代わりにStreamオーバーライドする必要があります。ユーティリティ メソッドとしての呼び出しのみのデフォルトの実装。Read(byte[], int, int)ReadByte()ReadByte()Read(buffer, 0, 1)

は、基になるストリームStreamReaderを呼び出します。問題を解決するには、このメソッドを正しく実装して、ストリームの最後に到達したときRead(byte[], int, int)に戻るようにします。0

于 2013-10-17T15:06:05.593 に答える
0

Stream.Readコードを読むと、シグナルが0 を返していることがわかります。

于 2013-10-17T14:58:46.757 に答える