[ Top ] > [ Communication ] > [ study ] > [ Java ]
>printとwrite
a
 
 

Printとwrite

05/02/02
Javaをやり始めた頃から疑問だったことの一つが解決しました。解決というか、少しもやもやしていたのがとれた感じ。Javaを初めて4日目です。

たぶん、Javaを始めたばかりの頃挫折する原因の一つと思えることだと思うんですけど、まず最初に覚えるメソッドってたぶん、
System.out.println
だと思います。しかし、しばらく進むとこんなメソッドが出てきます。
System.out.write
これです。これ。
なんで println じゃないんだろう・・・・。って、最初につまずいて挫折・・・。
多いと思うんですけど。

write の方は、引数が3つな事が多く
第一引数 byte型の配列
第二引数 オフセット(xバイト目から出力するか)
第三引数 出力する長さ(yバイト出力)
ほいで、第一引数に String型の値を指定したいときって結構あるような気がします。ちゃんと出力されているかどうかのテストとかね。

以下の例を見てみます。
int len; String str;
byte[ ] buf = new byte[1024];
while(true){
 try{
  len = System.in.read( buf );
  System.out.write( buf , 0 , len );
 }catch(Exception e){
 }
}

この例では、キーボードから入力された文字列をそのまま画面に表示するということをしていますが、read メソッドが引数で渡された byte型の配列 buf に、値をいれてます。で、そのまま write メソッドの第一引数に渡しています。
さて、ここで、 write メソッドではなく println ではダメなのか。それが、ずっとナゾでした。引数でbyte型の配列で渡すときは、writeメソッド 。なんて理解してしまえば、楽なんですけどなんかちょっと引っかかる。これから先、この答えが出るかもしれませんが、ここではあえて printlnメソッドを使ってみます。引数を byte型の配列から Stringクラスに変更すれば、printlnメソッドに渡せそうです。
えっと、buf[ ] Stringクラスにする方法は・・・。
何度かいろいろなことをしてやっと出来ました。

以下の例を見てください。
class byteToString{
  public static void main(String args[ ]){
   byte[ ] w ;
  String str = "abcdefg";
  //Stringクラスから byte型の配列へ
  w = str.getBytes( );
  System.out.write( w , 0 , str.length( ) ); //abcdefg が出力される
  //新しくStringクラスをインスタンス化
  String str2 = new String( w );
  System.out.println( str2 ); // abcdefg が出力される
 }
}

これを実行すると、「abcdefg」が出力されると思います。
getBytesメソッドは、StringクラスのメソッドでStringオブジェをbyte型の配列にして返します