[ Top ] > [ Communication ] > [ study ] > [ Java ]
>Stream-2-
a
 
 

Stream-2-

前回と同じものを、別な方法で実現させてみました。
キーボードで打ち込み、エンターキーを押すと、そのまま同じものが出力されます。

   > keyboardIo.java
class keyboardIo{
 public static void main(String args[ ]){
  byte[ ] buf = new byte[ 1024 ];
  String str;
  int len;
  while( true ){
   try{
    len = System.in.read( buf );
    System.out.write( buf , 0 , len );
   }catch(Exception e){
   }
  }
 }
}

さっきより短くできましたね・・・。
これを実行させると、さっきと同じ動作をします。

byte[ ] buf = new byte[ 1024 ];
byte型の配列を用意します。要素数は1024です。ここの値は、適当でかまいませんが慣用的に2のx乗を使います。で、この配列はキーボードから送られた文字列をいれておくバッファとなります。

len = System.in.read( buf );
そいで、ここの read メソッドの引数として使います。
さっきの buf ですが、byte 型でないとダメなようです。この read の引数として使う場合は。
char型long型を使ったら怒られました。
read( byte[ ] b ):入力ストリームからバイト数を読み込み、それをバッファ配列 b に格納します。実際に読み込まれたバイト数は整数として返されます。
ということで、戻り値でもあるバイト数を変数 len に入れてます。

System.out.write( buf , 0 , len );
第一引数にbyte型の配列、第二引数にオフセット・・・、つまりその配列のどこから始めるかを int型の値で指定、第三引数に出力する長さをセットします。
おや、System.out.print じゃぁありませんね。
System.out.print( buf );
に、直してみたら、変な記号がずっとでました・・・。
print メソッドの引数はいろいろな型があるのですが配列の場合は char 型と書いてあったので byte型の buf は、コンパイルエラーになるかと思ったんですが、平気でした。ナゾ・・・。
また、次のようにしてから print に渡してみました。
String str = buf.toString( );
やっぱりダメ・・・。同じ結果。
つまり・・・、byte型の配列で受け取ったならそれを扱えるメソッドで処理しれっ!
と、言うことでしょうか・・・。

a

で、ふと思いました。
byte[ ] buf = new byte[ 1024 ];
ここの 1024 の値を 2 にしたらどうなるか。
つまり受け取れる容器の大きさを小さくしたら・・・。

実は、変わりません。同じ動作をします。
2文字より多く打ち込んでも、そのまま返ってきます。
ここがナゾでした。Javaは、自動的に要領を送られてきた文字に合わせて大きくしたりしてくれるのか・・・?、と。

そこで、 byte[ 1024 ] のままで、

System.out.write( buf , 0 , len );
System.out.print( "\n" );

と、すると原因がわかりました。3文字目以降は次のループで処理しているんですね。たとえば、

>java keyboardIo
123456 ←打ち込んだ
12
34
56


>
こんな感じになります。