[ Top ] > [ Communication ] > [ study ] > [ Java ]
>Stream-3-ファイルストリーム
a
 
 

Stream-3-ファイルストリーム

次は、ファイルからデータを読み取り、画面に出力するプログラムです。これは、このソースファイルを読み込んで画面に出力します。
ファイルの操作するのにFileReaderというパッケージが必要ですので、
import java.io.FileReader;  か、
import java.io.*;
と、最初に記述します。*は、「io」というディレクトリ以下すべてのパッケージをという意味だと思います。
このドットシンタックスは、ディレクトリの階層を示しています。よって、
java というディレクトリの中にある io というディレクトリの中にある FileReader というパッケージ。
と、いう具合になると思います。

> fileReadAndOut.java
import java.io.*;
class fileReadAndOut{
  public static void main(String args[ ]){
  String fileName = "fileReadAndOut.java";
  try{
   FileReader fp = new FileReader(fileName);
   int c;
   while( ( c = fp.read( ) ) != -1 ){
    System.out.print((char)c);
   }
  }catch(Exception e){
  }
 }
}

String fileName = "fileReadAndOut";
今回は、「fileReadAndOut.java」というファイルを作成するので、そのファイルを読むことにします。

FileReader fp = new FileReader(fileName);
以前、ストリームを扱う実験でこんなことをしました。
   InputStreamReader i = new InputStreamReader(System.in);
キーボードから受け付けるために InputStreamReaderというクラスを使ったのでした。このクラスはReader をスーパークラスにもちます。
じつは、この FileReader も、Readerのサブクラスです。
ファイル名を引数に渡すようですね。このクラスのメソッドには read というものがあり、引数を渡さない場合は、ファイルから1文字第一引数にchar型の配列、第二引数にオフセット(0バイト目から)、第三引数に読み込む長さを渡してやると、その長さ分を第一引数で渡した配列にいれてくれるみたいですね〜。でも、後者の read は、扱いにくいですねぇ。1行読み込む。というメソッドはこのクラスにはないようです。
PHPやPerlを使っていたのなら、1行ずつ読み込んで欲しいものですよね。1行読み込むようにするには、こちらで。

while ( ( c = fp.read( ) ) != -1 )
read に、引数を渡していないので、1文字1文字読み込みます。また、 read は、戻り値に int 型の値を返すので、ここでの c は、int型にしてあります。
また、ファイルを最後まで読み込むと、-1を返しますので、それを目安にループしてやります。

 

> fileReadAndOut.java   1行ずつ読み込むように改良する
import java.io.*;
class fileReadAndOut{
  public static void main(String args[ ]){
  String fileName = "fileReadAndOut.java";
  try{
   FileReader fp = new FileReader(fileName);
   BufferedReader oneLine = new BufferedReader(fp);
   String msg;
   while((msg =oneLine.readLine()) != null){
    System.out.print(msg+"\n");
   }
  }catch(Exception e){
  }
 }
}

前回やったように、BuffereReaderクラスを使うと1行1行取り出せるようです。インスタンスするときにストリームを渡してやれば、作動するみたいですね。
このクラスには、readLine というメソッドがあるのでそれを使うと1行取り出せる。
また、戻り値は String 型(というか、Stringクラス)となるので、
String msg;
のように、前もって宣言しておきます。
最後まで読み込むと、今度は null を返してきます。

えっと、read メソッド は引数に「char型」の配列を渡すと、そこに読み込んでくれるみたいですね。
それで、読み込んだ文字数を返す。
引数を渡さないと、1文字読み込んで返す。
下に例を挙げておきます。

import java.io.FileReader;
import java.io.BufferedReader;

class fileReadAndWrite2{

 public static void main(String args[ ]){
  String fileName = "fileReadAndWrite.java";
  try{
   FileReader fp = new FileReader(fileName);
   char[ ] buf =new char[32];
   int len;
   while( ( len = fp.read( buf ) ) != -1 ){ //readメソッドに引数を渡す
    System.out.print(buf); //32文字以下でも32文字分出力
    System.out.write(buf , 0 , len); //読み込んだ32文字以内のみ出力
   }
  }catch(Exception e){
  }
 }
}