Skip to content
SATO Masatoshi edited this page Oct 20, 2023 · 1 revision

Packet

新しいデータのかたち

概要

基本的なデータは配列やファイルに格納されています。

JavaではInputStream / OutputStream と Reader / Writer で入出力があります。 ただ、Parserなどをつくるときには必要なところまで読んで、失敗したら戻って、などをくり返したいのですが読んでしまうと戻しにくい、など問題もあります。 大きい配列を用意しても最終的に足りなくなったりしたときに面倒なことになります。 テキストエディタなどをつくるときにもそういうような構造になるんじゃないかと思います。 データ構造をもう少しふわっと扱いたくなったので、先にデータ領域を用意するのではなく、必要に応じて継ぎ接ぎできればいいんじゃないかとFIFO、LIFOなど扱えるようなものをとりあえず組んでみたところ、使いやすそうなのでSoftLibの中核機能として育ててみました。 通常のInputStream, OutputStream が繋がったような構造で、書き込んだものがbyte配列と同じように保存され、読み込まれたところから消えていきます。 細かい配列を繋いで使える、というような感覚でもいいかもしれません。

                   Top      point                    Last
                   -------------------------------------
                   |        |InputStream   OutputStream|
                   |        |Read 読み  データ          |Write 追加

ファイルの構造

                  Top                    Last
                  ----------------------------
                  |FrontPacket    BackPacket|
                  |Read 読み  データ          |Write 追加
 逆書き BackWrite  |          ← 逆読みBackRead|

Packet の構造

読んだところから消えるため、常に point が Top の位置です。 戻りたい場合は読んだデータを書くことで戻すことができます。

分ける

Packet は 2つの Stream と 2つの 逆Stream を配列の前後につけたような構造です 先頭をFrontPacket, 末尾をBackPacket として扱うことができます。 それぞれInputStream, OutputStream っぽいことができます。

使い方

  • データを細切れに受け取って、まとめてから使いたいときの入れ物として
  • 処理サイズが不明なものをとりあえずParseなどしたいとき

応用?

FileにもFrontPacketを付けることができます。これは読み込みながら要らない部分を戻したりしたいときに使います 配列にもFrontPacket, BackPacketを付けることもできます。Block として別にまとめています。

Clone this wiki locally