11.6 ランダムアクセスファイル 11.7 StreamTokenizerクラス Javaゼミ第11回目 11.6 ランダムアクセスファイル 11.7 StreamTokenizerクラス 発表日 6月28日 発表者 加藤 友宏
ランダムアクセスファイル ストリームクラスでは、順次アクセスでファイル内のデータを読み書きのみ。 RandomAccessFileクラスは、ファイルのどの位置でもシークでき、その位置でデータの読み書きが可能。 例えば、ファイルに格納されているデータレコードセットを管理するのに使う。
ランダムアクセスファイル RandomAccessFileクラスのコンストラクタ (1) RandomAccessFile(File file, String mode) (2) RandomAccessFile(String name, String mode) (1) fileを読み込み元として、また場合によっては書き込み先として、ランダムアクセスファイルストリームを作成する。 (2) nameを持つファイルからの読み込み、およびオプションで書き込みを行うランダムアクセスファイルストリームを作成する 。 modeは、アクセスモードの指定。以下の4種類がある。
ランダムアクセスファイル RandomAccessFileは、DataInputインターフェイスとDataOutputインターフェイスを実装
ランダムアクセスファイル RandomAccessFileクラスに定義されている主なインスタンスメソッドの続き ファイルのどの位置にもランダムにアクセスできる → seek()が重要
ランダムアクセスファイルの例 ファイルの最後から指定した個数のバイトを表示するプログラム import java.io.*; class Tail { public static void main(String args[]) { try { // RandomAccessFileオブジェクトを //作成する RandomAccessFile raf = new RandomAccessFile(args[0], "r"); // ファイルの終わりに表示する // バイト数を決める long count = Long.valueOf(args[1]).longValue(); // ファイルの長さを決める long position = raf.length(); // 現在の位置にシークする position -= count; if (position < 0) position = 0; raf.seek(position); // バイトを読み取って、表示する while(true) { // バイトを読み取る try { byte b = raf.readByte();
ランダムアクセスファイルの例 実行結果 作成したプログラムの 最後40バイトを指定。 // 文字として表示する System.out.print((char)b); } catch (EOFException eofe) { break; catch (Exception e) { e.printStackTrace(); 実行結果 作成したプログラムの 最後40バイトを指定。 e.printStackTrace(); }
StreamTokenizerクラス StreamTokenizerクラスは、文字入力ストリームからデータを解析して、トークンの列を生成。 パーサ、コンパイラ、文字入力を処理するプログラムで重要な機能 数字または単語を表す文字のグループ
StreamTokenizerクラス StreamTokenizerクラスのコンストラクタ 4つ定数が定義されている StreamTokenizer(Reader r) rはReaderオブジェクト TT_EOF ファイルの終わり TT_EOL 行の終わり TT_NUMBER 数字を読み取ったこと TT_WORD 単語を読み取ったこと
StreamTokenizerクラス 3つのインスタンス変数に、重要な情報がある トークンが数字 →nvalに値、ttypeにTT_NUMBER トークンが文字列 →svalに値、ttypeにTT_WORD トークンが数字、文字列以外 → ttypeに読み取った文字
StreamTokenizerクラス StreamTokenizerクラスに定義されているインスタンスメソッド
StreamTokenizerクラス StreamTokenizerクラスに定義されているインスタンスメソッドの続き
StreamTokenizerを 使用する手順 ReaderのStreamTokenizerオブジェクトを作成 文字を処理する方法を定義 nextToken()を呼び出し次のトークンを取得 ttypeインスタンス変数を読み取り、トークンの方を判断 sval、nval、ttypeのいずれかのインスタンス変数からトークンの値を読み取る トークンを処理 nextToken()がStreamTokenizer.TT_EOFを返すまでステップ3~6を繰り返す
StreamTokenizerクラスの例 テキストファイルを読み取って、その内容を解析するプログラム import java.io.*; class StreamTokenizerDemo { public static void main(String args[]) { try { // FileReaderオブジェクトを作成 FileReader fr = new FileReader(args[0]); // BufferedReaderオブジェクトを作成 BufferedReader br = new BufferedReader(fr); // StreamTokenizerオブジェクトを作成 StreamTokenizer st = new StreamTokenizer(br); // ピリオドを通常文字として定義する st.ordinaryChar('.'); // アポストロフを単語文字として定義する st.wordChars('\'', '\''); // トークンを処理する while(st.nextToken() != StreamTokenizer.TT_EOF) { switch(st.ttype) { case StreamTokenizer.TT_WORD: System.out.println(st.lineno() + ") " + st.sval); break;
StreamTokenizerクラスの例 case StreamTokenizer.TT_NUMBER: System.out.println(st.lineno() + ") " + st.nval); break; default: (char)st.ttype); } // FileReaderオブジェクトをクローズする fr.close(); catch (Exception e) { System.out.println("Exception: " + e); }
StreamTokenizerクラスの例 実行結果 指定したテキストファイルの中身 ファイル名:tokens.txt The price is $23.45 Is that too expensive? (I don't think so) 1) The 1) price 1) is 1) $ 1) 23.45 2) Is 2) that 2) too 2) expensive 2) ? 3) ( 3) I 3) don't 3) think 3) so 3) )
練習問題1 RandomAccessFileクラスを用いて、コマンドライン引数から取得した文字列をファイルに追加していくプログラムを作成せよ。 書き込んだ後、ファイルの中身を表示すること。 なお、書き込むファイル名、書き込む内容は任意とする。 実行例 1行目 : orange 2行目 : strawberry 3行目 : apple 4行目 : banana 5行目 : avocado 作成したファイルの中身 orange strawberry apple banana avocado
練習問題2 コマンドライン引数で取得したファイル名のソースに、Java のいくつかの予約語が、どのくらいの回数使われているのかを調べるプログラムを作成せよ。 調べる予約語は、if,else,try,catch,while,switch,break, continueの8個とする。 実行例 ifが使われた回数は、12回 elseが使われた回数は、10回 tryが使われた回数は、4回 catchが使われた回数は、4回 whileが使われた回数は、4回 switchが使われた回数は、3回 breakが使われた回数は、3回 continueが使われた回数は、3回