私は、一般的なストリームからデータを読み取る単純な方法の魔女を書いています。つまり、長さを知らずにFileStreamまたはNetworkStreamになる可能性があります。私は繰り返しストリームをバイト[]に読み込み、データを別のストリームなどにプッシュします。私の質問は、ストリームが終了したことをどうすればわかりますか?私は返信しようとしたときのメソッドが0を返す - これは正しい方法ですか?ファイルを読むのは問題ありませんが、ネットワークからデータを読み取るときに問題が発生することがあります。ストリームが最後まで読み込まれたことをどのように伝えることができますか?
答えて
はい、繰り返しRead
を呼び出し、0を返すと終了するのはまさに正しい方法です。
ネットワークストリームもこれで問題なく、データが受信されるか、ストリームが切断されるまでブロックされます。 Stream.Read
のドキュメントを見てください:
戻り値は 位置が ストリームの終わりに現在ある場合のみゼロです。実装は、 データがない場合、少なくとものデータを読み取ることができるまで、 をブロックします。 readは、 のストリームにデータがなくなり、それ以上のデータが存在しない(例えば、 クローズドソケットまたはファイルの終わりなど)場合にのみ、0を返します。
ネットワークストリームの場合、Stream.ReadByte()が0より小さい値を返す場合、ストリームが最後まで読み込まれたことがわかります。
NetworkStreamのループ本体にReadメソッドの直後にReadByte()メソッド呼び出しを置く必要があることを意味しますか? –
Jonは言うとおり、0バイトを返すのでファイルの終わりです。ただし、投げられるさまざまな例外も考慮する必要があります。ネットワークは本質的に信頼性が低いため、常に例外がいくつかあります。
たとえば、ストリームが切断された場合(反対側が単にソケットを閉じるのではなく)、IOException
の例外を受け取ることがあります。 I/O呼び出しを常に例外ハンドラでラップします。ただし、例外をスローできないことが確実な場合を除きます。
例外がスローされる可能性があるからといって、それらをハンドラでラップする必要はありません。私の経験では、IOコールがIOExceptionをスローすると、そのメソッドを*作成する*コールは通常例外のバブルを許可するだけです。私は、ほとんどのtry/catchブロックを持つ傾向があります - 通常はトップの近くにあります。 –
私はすぐにそれをキャッチする必要はありませんでした。しかし、それはある時点で捕らえられるべきです。 –
- 1. ファイルが最近FTPフォルダ内で上書きされたことをどのように伝えることができますか?
- 2. Unityで読み込み画面を作る方法、シーンが完全に読み込まれたかどうかを調べることができます
- 3. 最初にスクロールしたときにのみコンテンツを読み込むことができますか?
- 4. Vtiger CRM:変更された.tplファイルをどのように読み込むことができますか?
- 5. どのようにlog4jにプロパティファイルがあるのかを伝えることができますか?
- 6. 誰かがこのMSテキストが伝えようとしていることを説明できますか?
- 7. 誰かがこのコードスニペットの内容を伝えることができます
- 8. どのように私はそれらのidでjavascriptテンプレートを読み込むことができますか?
- 9. 私のgitブランチが変更されたEmacsにどうやって伝えることができますか?
- 10. フォームパラメタを動的に読み込むことができます
- 11. 行がないときにこれをどのように数えることができますか?
- 12. どこでcsvをホストできるので、直接neo4jデータベースに読み込むことができますか?
- 13. csv.readerに最後の行があることを伝える
- 14. XULでは、ブラウザタグの読み込みが完了したことをどのように知ることができますか?
- 15. php://入力ストリームをバッファから読み込むことはできますか?
- 16. AJAXが読み込まれたページのURLを保存するため、更新後に読み込むことができます
- 17. デバイスにアプリケーションを読み込むことができません
- 18. WPFでは、リソースからメニューをどのように読み込むことができますか?
- 19. WebViewでURLを読み込むことができません
- 20. iOS、SQLite:DBから読み込むことができません
- 21. Eclipseでこのプロキシエントリがどこから読み込まれていますか?
- 22. 列に埋め込まれたリストと範囲をどのように扱うことができますか?
- 23. rspec "そのようなファイルを読み込むことができません"
- 24. RubyのMULTIブロック内でRedisからどのように読み込むことができますか?
- 25. アドインは、ソリューションが読み込まれたときにどのように検出できますか?
- 26. マスター/スレーブレプリケーションは、書き込みが後で読み取られることを確実にしますか?
- 27. どのようにiframeを使わずにCodeigniterのWordpressページを読み込むことができますか
- 28. WindowsXPでApache2.2.17にPHP5.3.5を読み込ませることができません!
- 29. TextBoxでEnterキーが押されたことをどのように伝えますか?
- 30. ストリームが閉じているかどうかをどのように知ることができますか?
私は訂正された、ありがとう。 – JoshBerke
それから、ネットワークストリームのデータの長さを知る必要があると思われますか? –
長さを知ることは助けになりますが、厳密には必要ではありません。 –