welcome: please sign in
location: "ファイル入力"の差分
25と26のリビジョン間の差分
2009-11-24 02:05:37時点のリビジョン25
サイズ: 6585
編集者: masahiko
コメント:
2009-11-24 02:07:11時点のリビジョン26
サイズ: 6663
編集者: masahiko
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 11: 行 11:
=== 概要 ===
行 30: 行 31:
=== インスタンスの作成 ===
行 50: 行 52:
=== 各行の入力 ===

ファイル入力

ファイル入出力のために、 つぎの4つをスーパークラスとする数十個のクラスが用意されています。

  • InputStream バイト入力

  • OutputStream バイト出力

  • Reader テキスト入力
  • Writer テキスト出力

なおこの4つは抽象クラスのため、直接利用することはできません。


概要

テキスト形式のファイルからの入力には Readerクラスのサブクラスである BufferedReader クラスを利用します。

BufferedReader クラスの readLineメソッドを使うことで1行ずつ読み取ることができます。

利用する機能は次の3つです。

  •    1  BufferedReader b;
       2  String s;
       3 
       4  b = new BufferedReader( ... );
       5  s = b.readLine();
       6  b.close();
    
  • 4行目で、BufferedReaderクラスのインスタンスを作ります。

  • 5行目で、このインスタンスを使ってreadLineメソッドを使って1行分読み取り、結果を文字列sに代入しています。
  • 6行目で、ファイルを閉じています。

ファイルを使い終わったときには、ファイルを閉じる処理が必要です。
ファイルの使い始めのopenは必要ありません。インスタンスを作ればよい。


インスタンスの作成

BufferedReaderインスタンスを作成するときには、 コンストラクタの引数としてFileReaderのインスタンスを与える必要があります。

FileReaderコンストラクタの引数にはファイル名を与えます。

  •  FileReader f;
     f = new FileReader( "filename" );
     b = new BufferedReader( f );

インスタンスfはここでしか用いないので、次のように記述することもある。

  •  b = new BufferedReader( new FileReader( "filename" ) );

ファイル名や1文字ごとの情報はFileReaderインスタンスの状態として保持され、 行単位の情報はBufferedReaderインスタンスの状態として保持されると考えればよい。

  • filereader1.png

処理はBufferedReaderインスタンスへのメソッドを通して行います。


各行の入力

readLineメソッドはファイルの終わりに達したときは null を返します。
ファイルを1行づつ読んで終わりまで処理するには、5行目を次のように修正します。

  •  while( true )
     {
         s = b.readLine();
         if(s == null)
             break;
     //  各行での必要な処理はここに書く
     }

これと同じ内容を、次のように書くこともできます。

  •  while( (s = b.readLine() ) != null)
     {
     //  各行での必要な処理はここに書く
     }


ここまでをまとめると次のようになります。

  •    1  FileReader f;
       2  BufferedReader b;
       3  String s;
       4  
       5  f = new FileReader( "filename" );
       6  b = new BufferedReader( f );
       7  
       8  while( (s = b.readLine()) != null)
       9  {
      10         // 各行での必要な処理はここに書く
      11  }
      12  
      13  b.close();
    


例外処理

プログラム実行中になんらかの例外が起こることがあります。

例外が起こったときにプログラムの実行を中断するのではなく、なんらかの処理を行うよう記述できます。

  • reigai1.png

例外処理の記述には try,cahtch 構文を用います。

  • reigai2.png

  • 1番目のブロックに通常の処理(図の青の部分)を記述します。
  • 例外には受け取る例外の型と変数を記述します。
  • 2番目のブロックには例外が起こったときの処理(図の赤の部分)を記述します。

ブロックは

  • { で始まり
  • 文を必要なだけ書き
  • } で終わりました。

通常は次のように記述します。 catchの箇所のインデントの仕方が、他の場合と違います。

  •  try
     {
         ...
     } catch(...) {
         ...
     }


ファイル入力時の例外処理

ファイル入力時には例外が発生する可能性があるので、必ずtry,catchを書きます。

ファイルを開く(インスタンスを作る)ところから、ファイルを閉じるところまでの範囲をtryのブロックにし、 その後ろにcatchを加えます。

ファイル入力のときの例外は Exception型とし変数名をつけます。

ファイル sample.txt の内容を表示するプログラムは次のように書けます。

   1 public class ReadSample
   2 {
   3         public static void main(String[] args)
   4         {
   5                 try
   6                 {
   7                         FileReader f;
   8                         BufferedReader b;
   9                         String s;
  10                         
  11                         f = new FileReader( "sample.txt" );
  12                         b = new BufferedReader( f );
  13                         
  14                         while( (s = b.readLine()) != null)
  15                         {
  16                                 System.out.println( s );
  17                         }
  18                         
  19                         b.close();
  20                 } catch(Exception e) {
  21                         System.out.println( e );
  22                 }
  23         }
  24 }


パッケージを利用する

Javaであらかじめ用意されているクラスはパッケージに分けて管理されています。

上に示したプログラムをコンパイルしようとすると、FileReaderやBufferedReaderが分かりません、というエラーが出ます。

利用するクラスがどのパッケージに含まれているかを示さなければなりません。

  • FileReaderとBufferedReaderはjava.ioパッケージに含まれています。

書き方1 クラス名をフルネームで書く

  • クラスのフルネームとはパッケージ名とクラス名をピリオドではさんでつないだものです。
  • プログラム中で使われている箇所をフルネームに修正します。
    • java.io.FileReader

    • java.io.BufferedReader

書き方2 import文でフルネームを書く

  • プログラムの先頭にimport文を追加し、利用するクラス名をフルネームで書く。
  • これによりプログラム中ではフルネームで書かなくても、省略してクラス名だけで使える。
    • import java.io.FileReader;

    • import java.io.BufferedReader;

書き方3 import文でパッケージを指定する

  • プログラムの先頭にimport文を追加し、利用するパッケージを書く。
  • 同じパッケージ内の複数のクラスを利用するときは、パッケージの後ろに * をつけて示すことができる。
    • import java.io.*;

ファイル入力 (最終更新日時 2009-11-25 00:33:32 更新者 masahiko)