紙コップ

最も原始的なInputStreamクラスを扱うサンプル

2009-02-24 15:26:26

Javaはデータをストリーム(流れ)と表現して扱います。ファイルからの読み込みであれ、ネットワークからの読み込みであれ、入力という流れであり、ファイルへの書き込みやネットワークへの書き出しも、出力という流れとして捉えます。



入力ストリームの一番の基となるクラスは、InputStreamクラスで、すべての入力ストリームクラスのスーパークラスです。一番の基礎部分なのですが、洗練されておらず、バイトデータを操作します。そのため、文字の扱いが一筋縄ではいきません。通常、テキストデータを操作するには、Readerクラスとそのサブクラスを使うことが効率的で安全です。



しかし、このInputStreamは、ことネットワークデータの扱いでは重要になってきます。というのも、ネットワークを流れるデータはバイトデータとして流れているからです。そこは、どんな文字コードで書かれたテキストデータが流れていてもバイトデータとして流れています。ですので、「データはバイトの流れ」であるという(機械に近いという意味で)低レベルの理解が必要です。



前置きが長くなりましたが、そういったわけで、InputStreamはイメージしにくい、わかりにくいクラスです。僕もいつも悩みますので、簡単なサンプルコードを備忘録のために置いておきます。



このサンプルは、第一引数に指定したURLアドレスのHTMLコードをそのまま読み込み、標準出力に出力します。第二引数に読み込みのバッファサイズを指定します。



文字コードを適切に処理しないため、だいたい文字化けします。文字コードを適切に処理しないのは、バイトデータを素直にそのまま読み込むInputSteamの素直な性質です。



■Javaソースコード(InputStreamTest.java)

/**

* 最も原始的なInputStreamクラスを扱うサンプル

*/





import java.io.*;

import java.net.*;



public class InputStreamTest {

  public static void main(String[] args) {

    InputStreamTest i = new InputStreamTest(args[0], Integer.parseInt(args[1]));

  }

  public InputStreamTest(String address, int buffSize) {

    byte[] buff = new byte[buffSize];

    InputStream in = null;

    try {

      in = new URL(address).openStream();

      

      int b = 0;

      while((b = in.read(buff)) != -1) {

        System.out.write(buff, 0, b);

      }

    } catch(MalformedURLException e) {

      System.err.println("" + e);

    } catch(IOException e) {

      System.err.println("" + e);

    } finally {

      try {

        in.close();

      } catch(IOException e) {}

    }

  }

}





この記事が、参考になった、面白かったという方はクリックをお願いいたします!





[ブログ内検索用キーワード]

Java InputStream buff byte 入力 ストリーム

※このエントリは ブロガーにより投稿されたものです。朝日インタラクティブ および ZDNet Japan編集部の見解・意向を示すものではありません。
  • 新着記事
  • 特集
  • ブログ