Memorandums?

This blog is written about technical-discoveries and daily-events.

InputStreamReaderでの文字列の受信

InputStreamReaderは、char文字(単一文字)単位でしかデータを受け取れません。
そのため、改行までを文字列として取得するのは、それなりに大変です。
今回は、文字列に変換する方法を示します。

それならBufferedReaderのreadLineメソッドで余裕じゃん!
といいたいところかもしれませんが、その理由については後ほど(笑)

文字列に変換するポイントは、StringBuilderを使うことです。
StringBuilder#appendによって、一文字づつ追加ができます。

コードを示します。

StringBuilder sb = new StringBuilder();
while ((data_tmp = in.read()) != '\n' && data_tmp != -1) {
	sb.append((char)data_tmp);
}
data_str = new String(sb);
sb.setLength(0);

まずは、InputStreamReader#readによってchar文字を読み取ります。
それが改行コードや、終了コードでないならば、
StringBuilderに追加します。
全て追加が終わり、ループを抜けた後、String型に戻して完成です。
おそらくこの処理は、常時受信処理でしょうから、次の受信のためにStringBuilderを空にするのを
忘れないようにします。

ちなみに先ほど'改行コード'とイイましたが、
Windowsの場合は、改行コードは"\r\n"です。
この区別については、前々回のエントリーの
meriyasu-blog.hatenablog.com
に書いています。
参考になれば幸いです。

なんやかんやで簡単にInputStreamReaderの文字列化ができてしまいました。

先延ばしにした、なぜBufferedReaderを使わないのか、ですが、

BufferedReader br = new BufferedReader(new ObjectInputStream());

ということができず、InputStreamReaderならば、

InputStreamReader isr = new InputStreamReader(new ObjectInputStream());

ということができるからです!!

前回のエントリー、
meriyasu-blog.hatenablog.com
でも述べたように、今回、画像転送も必要としました。

しかし、もちろんBufferedReader, InputStreamReaderなどでは画像送信はできず、
ObjectInputStreamを使用する必要があります。

サーバークライアント通信において
一つのクライアントとサーバーを繋ぐソケットは基本的に一つです。
そのソケットのInputStreamも一つです。

そのため、ObjectInputStream用にsocketのInputStream,
BufferedReader用にsocketのInputStreamとするのはよくないです。
(closeするときなどに問題が起きるため)

よって、socketのInputStreamを一つにするため、

ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
InputStreamReader in = new InputStreamReader(ois);

とできるInputStreamReaderを採用しました。
(そうしないと自分が実装できないだけで、できるのかもしれません())