• ベストアンサー

BufferedReaderなどについて

今JAVAを勉強しているのですが。 少しつまづいてしまいました。 ---------------------------------------------- import java.io.*; class Cat { public static void main(String args[]) throws IOException { File inputFile = new File(args[0]); FileReader in = new FileReader(inputFile); BufferedReader br = new BufferedReader(in); //・・・続く ---------------------------------------------- 上のプログラム全て、といいますか import java.io.*; や BufferedReader のことが特によく分かりません。いろいろサイトや本などを見てみたのですが、それでもいまいち理解できませんでした。どなたか、教えてください、お願い致します

質問者が選んだベストアンサー

  • ベストアンサー
  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.2

 あー、ここはつまづきますよねぇ。  IO系はもう、呪文ですよね、呪文。  でも、ここを正しく理解できるとその汎用性の高さや柔軟性に感動できますよ。  プログラムをもう少し細かくしてましょう。 import java.io.*; class Cat { public static void main(String args[]) throws IOException {   File inputFile = new File(args[0]);   FileInputStream fs = new FileInputStream(inputFile);   InputStreamReader ir = new InputStreamReader(fs);   BufferedReader br = new BufferedReader(ir); //・・・続く  FileReaderはFileInputStreamとInputStreamReaderの組み合わせでしかないので、細かくするとこうなります。  なんだかごちゃごちゃしていますが、当然それぞれに役割があり、それを理解するためにはコンピューターにおける文字の取り扱いついて知っておく必要があります。  本当はコンピューターは意外とおばかさんで、文字というものを知りません。  数字しか知らないのです。  しかし、それでも文字を取り扱わなくてはいけません。  苦肉の策として、文字を数字として置き換えるという方法がとられました。  話を単純化させるために世界には「あいうえお」の5文字しか文字がないとしましょう。  コンピューターもわかるようにそれぞれに背番号を打ちます。 あ(0)、い(1)、う(2)、え(3)、お(4)  もし、「あいうえお」と書かせたテキストファイルがあるとしたら、実はそのファイルの中身は「01234」という数字が記録されているだけなのです。  問題が複雑なのが、この背番号制(文字コード)が複数あり、往々にしてファイルとして書かれている文字コードとJavaで内部的に使用している文字コードが違うことです。  ファイルで書かれている文字コードが上記、Java内部で使用されている文字コードが あ(10)、い(11)、う(12)、え(12)、お(13)  と、しましょう。  では、Javaではこれをどのように読み込んでいくのかというと、 (1)まず、Fileクラス  ファイルのパス、つまり位置を表すクラスですね。 (2)次にFileInputStream  Fileで表してある位置の生のバイトデータを読み込むクラスです。今回の例で言うとファイルから「01234」という数字を順次読み込んでいきます。 (3)そして、InputStreamReader  InputStreamを内部に保持し、そのInputStreamから読み込まれた数字をJava内部で使用する文字コードに変換し文字をして解釈していきます。  たとえば、InputStreamから0が読み込まれるとそれを10に変換し、Java内部で「これは『あ』を表しているんだな」と解釈します。  これで、基本的には文字を読み込めます。 (4)では、BufferedReaderは何をやっているかというと、  InputStreamReaderで一文字づつ文字を読み込んでいると、そのたびにハードディスクにアクセスが発生し効率的ではありません。お猪口で井戸水をくみ上げているようなものですね。  読み込むときはドバッと読み込みたいわけです。  BufferedReaderはInputStreamReaderなどのReaderを内部に保持し、文字が必要なときに保持しているReaderからドバッと読み込み、ある程度自分の中に貯めておき、それを小出しにしてくれるわけです。  そうすることにより、ハードディスクへのアクセスのパフォーマンスが向上します。  だいたい理解できたでしょうか?  でも、なぜ、こんなに機能をばらばらにしてあるのでしょうか?  それは、柔軟性と汎用性にあります。  今回はFileInputStreamを使いましたが、これをSocketのInputStreamに変えるとあっという間にネットワークから文字を読み込むプログラムにはやがわり。  URLConnectionのInputStreamにするとWebから文字を読みことができ、組み合わせによっていろんなことでできます。  最初の敷居は高いのですが、いったんこの仕組みを理解することができれば、かえって覚えることは少なくてすみますよ。

megumi0808
質問者

お礼

詳しく丁寧に教えていただいてありがとうございます! がんばって理解していきたいと思います

その他の回答 (2)

  • sasadora
  • ベストアンサー率68% (59/86)
回答No.3

要点だけ。 Reader系は"テキスト"データを読むためのものです。読み込んだデータは文字列として取得できます。 FileReaderは、ファイルから読み込むReaderです。つまりテキストファイルを読み込むReaderです。 Reader系はどれも同じように使用可能です。ファイルからだろうがストリームからだろうが、同じようにreadすることができるので、使い方が統一されていて覚えるのが楽です。 BufferedReaderは、他のReaderにかぶせて使うReaderです。バッファリングすることで効率的に読み込みを行います。 今回の例では、 FileからFileReaderを作りました。これでテキストファイルを読み込めます。 さらにFileReaderからBufferedReaderを作りました。これでバッファリングしながら(効率的に)テキストファイルを読み込めます。  BufferedReader→FileReader→File Readerを連鎖させることで、色々な組み合わせができます。 BufferedReader→InputStreamReader→ソケット  ネットワークからのデータを文字列としてバッファリングしながら読み込むReader BufferedReader→InputStreamReader→ByteArrayInputStream→バイト配列  バイト配列のデータを文字列としてバッファリングしながら読み込むReader こんな感じでどうでしょう?

  • hrykhsmt
  • ベストアンサー率50% (5/10)
回答No.1

「import java.io.*」は「java.io」にある 全てのクラスをインポート、つまり使用可能にする という意味です。 javaでインポートをする必要がないパッケージは 「java.lang」だけなので、 「java.io.BufferedReader」はインポートする必要が あります。 「import java.io.*」を「java.io.BufferedReader」に 変えても問題ありません。

参考URL:
http://www.toyama-cmt.ac.jp/I/ensyuu/java/docs/ja/api/java/io/BufferedReader.html
megumi0808
質問者

お礼

参考になりました! ありがとうございました^^