私は長年疑問に思っていた質問があり、誰かが私の心を休ませるために答えてくれることを望んでいました.
入力ストリーム (ファイル/ソケット/パイプなど) があり、受信データを解析したいとします。最も一般的なインターネット プロトコルのように、受信データの各ブロックが改行で分割されていると仮定しましょう。このアプリケーションは、html、xml、またはその他のスマート データ構造を解析することもできます。ポイントは、データが固定長ではなく区切り文字によって論理ブロックに分割されることです。区切り文字が表示されるのを待つためにデータをバッファリングするにはどうすればよいですか?
答えは単純に思えます: 全体に収まる十分な大きさのバイト/文字配列を用意するだけです。
しかし、バッファーがいっぱいになった後に区切り文字が来るとどうなるでしょうか? これは実際には、データの動的ブロックを固定サイズのブロックに収める方法に関する質問です。私は本当にいくつかの選択肢しか考えられません:
必要に応じてバッファ サイズを増やします。これには、大量のメモリの再割り当てが必要になる可能性があり、特別に細工されたストリームによるリソースの枯渇につながる可能性があります (または、枯渇攻撃から身を守り、リソースを枯渇させようとする接続を切断する必要があるソケットの場合は、サービス拒否にさえつながる可能性があります...そして攻撃者は、保護をトリガーするために偽の特大のパケットを送信し始めます)。
循環バッファーを使用して、古いデータの上書きを開始します。論理ブロックが不完全になるため、おそらく理想的な方法ではありません。
バッファがいっぱいになったら、新しいデータをダンプします。ただし、この方法では区切り文字が見つからないため、この選択は明らかに適切なオプションではありません。
固定サイズのバッファを非常に大きくし、すべての着信論理データ ブロックがその境界内にあると仮定します...そして、いっぱいになった場合は、完全なバッファを論理ブロックとして解釈するだけです...
どちらの場合でも、論理ブロックが特定のサイズを超えることはないと想定する必要があると思います...
このトピックについて何か考えはありますか?readLine()
高水準言語はストリーム メソッドで何らかのバッファリング メカニズムを提供するため、明らかに方法が必要です。
これを解決する「最善の方法」はありますか、それとも常にトレードオフがありますか? ある種のパーサーを書く必要があるたびにこの質問に悩まされていたので、このトピックに関するすべての考えとアイデアに本当に感謝しています。