もう少し、Java での、ストリームを使ったネットワーク・プログラミングについて
見てみましょう。
次のプログラムも、先のプログラムとほとんど同じ働きをします。 しかし、ストリームの作り方がちょっと変わっています。さきに引用した部分と、 次の部分を比べてみて下さい。
u = new URL( src ); uc = u.openConnection(); in = uc.getInputStream();
先のプログラムでは、URLから直接 openStream で、InputStream を作りましたが、 この例では、URL に、メソッド openConnection()を働かせて、ucという名前の インスタンスを得ています。このucは、プログラムをみれば、URLConnectionという クラスのインスタンスであることが分かります。
ここでは、このURLConnectionに対して、getInputStream() というメソッドを使って
ストリームを獲得しています。
いったんストリームが獲得されれば、その後の処理は、よく似たものになります。 ただ、次の所に新しいメソッド getContentLength(), getContentType が登場して いることに注目してください。
System.out.println("Content-length: " + uc.getContentLength()); System.out.println("Content-type: " + uc.getContentType());
この部分の出力は、例えば、次のようになります。
sparc04$ java UrlConnection http://www.sun.com <--- プログラムの実行 Content-length: 1008 <--- コンテンツのサイズ Content-type: text/html <--- コンテンツのタイプ ........ ........ (省略) ......
このクラス URLConnection では、このほかに、WWWサーバとNetscape などの
Web Browser との間のデータのやりとりのプロトコル HTTP に対応した様々の
メソッドが用意されています。
先の部分に新しいメソッドを付け加えたサンプルを以下に示します。 こうして、URLConnection クラスを利用すれば、HTTPのヘッダ情報 も簡単に読み取ることが出来ます。
System.out.println("Content-length: " + uc.getContentLength()); System.out.println("Content-type: " + uc.getContentType()); System.out.println("Content-encoding: " + uc.getContentEncoding()); System.out.println("Date: " + new Date(uc.getDate())); System.out.println("Expiration: " + uc.getExpiration()); System.out.println("LastModified: " + new Date(uc.getLastModified()));
URLConnectionクラスの働きをもう少し詳しく知るためには、Content Handler や
Protocol Handler といったものの知識が必要になります。こうした話題は、
後日ふれることになるでしょう。
少し、ストリームの話題から脱線してしまいました。もう一度、ストリームの 話に戻りたいと思います。
**************************** ** UrlConnection.java **************************** 1 import java.net.*; 2 import java.io.*; 3 4 class UrlConnection { 5 6 InputStream in = null; 7 URLConnection uc = null ; 8 9 UrlConnection(String src){ 10 URL u = null ; 11 try { 12 13 u = new URL( src ); 14 uc = u.openConnection(); 15 in = uc.getInputStream(); 16 byte buf[] = new byte[256]; 17 int n; 18 19 System.out.println("Content-length: " + uc.getContentLength()); 20 System.out.println("Content-type: " + uc.getContentType()); 21 22 while((n = in.read(buf, 0, buf.length)) != -1){ 23 System.out.write(buf,0,n); 24 } 25 26 } catch (Exception e){ 27 System.err.println("Exception : "+e); 28 } 29 } 30 31 public static void main(String argv[]){ 32 try { 33 UrlConnection uc = new UrlConnection(argv[0]); 34 } catch (Exception e){ 35 System.err.println("Exception (main) : "+e); 36 } 37 38 } 39 }