感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

ネットワークプログラマはPrintStreamを避けるべき

<スポンサーリンク>

Javaネットワークプログラミングを勉強したため、内容のまとめ。
Javaでネットワークプログラミングを行う際の、各APIの中身を詳しく説明してくれているため、本質を追求する勉強ができる。

Javaネットワークプログラミング 第2版

Javaネットワークプログラミング 第2版

  • 作者: エリオット・ラスティハロルド,Elliotte Rusty Harold,戸松豊和,田和勝
  • 出版社/メーカー: オライリー・ジャパン
  • 発売日: 2001/10
  • メディア: 単行本
  • 購入: 2人 クリック: 13回
  • この商品を含むブログ (8件) を見る

★★★
■Java I/O

・Java I/Oの基本はストリーム。入力ストリームはデータを読み込む。出力ストリームはデータを書き出す。

■出力ストリーム
・基本出力クラスはjava.io.OutputStream

・FileOutputStreamはファイルにデータを書き出す

・TelnetOutputStreamはネットワークにデータを書き出す

・たとえばストリームが1024バイトのバッファを持っているとすると、ストリームはバッファが一杯にならないとバッファ内のデータを送信しない
flush()メソッドを使用すれば、バッファが一杯になっていなくてもバッファつきストリームに強制的にデータを送信させることで、「バッファが一杯になるのを待つ」というデッドロックを解消できる。

・ストリームはクローズする直前に必ずフラッシュするべき。ストリームがクローズした時にバッファに残されていたデータが失われる可能性がある。

■入力ストリーム
・Javaの基本入力クラスはjava.io.InputStream

・FileInputStreamはファイルからデータを読み込む

・TelnetInputStreamはネットワークからデータを読み込む

・InputStreamの基本メソッドは引数なしのread()メソッド。入力ストリームのソースから1バイトのデータを読み取り、それを0〜255の数値として返す。
ストリームの終わりに到達すると-1を返す。

■PrintStream
・ネットワークプログラマがPrintStreamを避けるべき3つの理由
1.printlin()の出力がプラットフォームによって異なるため、行終端子がLFになったり、CRになったり、CR+LFになったりする。
コンソールに書き出すなら問題ないが、厳密なプロトコルに従う必要があるネットワーククライアント/サーバを書く時は大きな問題になる。
2.実行中のプラットフォームのデフォルトのエンコーディングが使用されること。
3.PrintStreamは例外をすべて処理してしまう。つまり、下層の出力ストリームによって投げられた例外を補足してしまう。
 これは信頼性が低く、例外が生じる可能性があるネットワーク通信には向かない。
 
■Socketクラス
java.net.socketクラスはクライアント側のTCP操作を実行するJavaの基本クラス。