はじめに
この記事はリンク情報システムが主催するイベント「Tech Connect! Autumn」のリレー記事です。
「Tech Connect! Autumn」は engineer.hanzomon のグループメンバによってリレーされます。
(リンク情報システムのFacebookはこちらから)
1日目は本イベント言い出しっぺの大伍がポエムをお送りします。
InputStreamを樽に刺す
普段何気に使っているjava.io.InputStreamの主観的印象を膨らませるポエムです。
・・・・・
Streamから受ける印象は「流れ」。
ファイルなどを読む時に先が尖っていそうなInputStreamを樽に刺す。
刺すとそこからデータが水のように出てくるのでBufferedReaderなどで少しづつ貯めながら飲んでいく事となる。
最初は飲めるものと思っていました
プログラム書くときはドバドバ流れ出しても困るので、読む分量を指定するなどして手で塞ぎながら飲んでいく。
read()とclose()は、流す・塞ぐ感じがあり、水っぽくて良い感じである。
だが、skip()というメソッドはnバイトのデータをスキップしちゃうので、その間の水はどうするの?という疑問が生じて水っぽくない。
そもそもInputStreamが扱えるのはbyteなので、角ばっていて数字を表すものが良い。
数字が書いてあるカードが並んでるとしよう。樽と水はさっさと忘れよう。
カードのもらい方
最初にread()すると先頭のカードがもらえる。
そこには0~255の数字が書いてあるので、それをASCIIと解釈したり、画像データの一部と解釈したり自由にして良い。
もう一回read()すると次のカードがもらえる。
なので、InputStreamは直前に渡したカードの位置を自分で覚えていることになる。
read()は1バイトづつ読むものと、サイズを指定してガサっと読むメソッドが定義されており、サイズ指定read()は内部で1バイトread()をコールしている。
mark()すると、そのカードの位置を覚えてくれて、reset()でその位置に戻ってくれる。
生粋のjava.io.InputStreamはreset()を呼ぶと激怒してIOExceptionを投げてくるが、そもそもmark()やreset()はあまり使わないから、怒り易いことも知らないし、知る必要もない。
InputStreamに水らしさは完全に無くなり、カードすらも喧騒によるカジノ感が出てきた。
abstractだった
available()というものあり、あとどの位カードが残っているかを教えてくれる約束になっているが、生粋のjava.io.InputStreamは必ずゼロを返す。
多分、読み込み対象が超巨大だったり、連続したデータを扱う事を前提としたくないから?、カジノを取り仕切っているおじさん仕様決定者がゼロを返してよいと決めたのであろう。
最後のカードを読み終え、再度read()を呼ぶと-1が返却される。
カードがもうない時は-1。
ここまで書いたが、java.io.InputStreamはabstractである。
結構な人たちがその字面からinterfaceの感触を受けていると思うがabstractである。
interfaceだったら、働かずに各種やり取りの調停を行う、どちらかというとコンパイラ側の人の印象となるが、InputStreamはabstractなので、若干の筋肉感と働き者感がでてきた。
カジノでカード配っている人はディーラしかいない。
もっと清楚な人です
カジノのディーラーと書いたが、実際の使い心地はもっと清楚で真面目な感じがあるので、java.io.InputStreamは白系の服を着てかっちり仕事をこなす清楚なリゾートカジノディーラー(カード担当)に近しいか。
黒縁の眼鏡をかけている。
InputStreamを継承した子たちは遺伝子と責務を自身に取り込みつつ、今日も様々なリゾートカジノで働いている。
その眼鏡の奥にはJDK1.0からの実績と自信が満ち溢れている。
明日は@taisuke3です。