データの入出力 データの入出力データをキーボードからコンピュータに入力することや CRT に表示すること, さらにハードディスク (HDD) や MO などに保存されているファイルからデータをコンピュータに読み込むことや ( 逆に ) データをこれらの装置に保存すること データ入出力用クラス 外部 ( キーボード,CRT, ファイル (HDD や MO など )) からのデータの読み込み, 書き出しのためのクラスが存在する java.io パッケージ データを入出力するための 出入口 を ストリーム と言う. ( つまり プログラムがデータを入出力するための機能要素が該当する ) Java ではストリームクラスが提供され, このクラスによりデータのやり取りを行なう データを入出力する手順 1 ストリーム ( すなわち, ファイル ) をオープンする ( 通常 1 回 ) 2 データを読み込む, あるいは, 書き出す 3 ストリームをクローズする ( 通常 1 回 ) (1) 文字単位のデータの入出力 文字ストリームクラス (16ビットの文字データ) (2) バイト単位のデータの入出力 バイトストリームクラス ( イメージやバイナリデータ ) Reader BufferedReader InputStreamReader 読み込み用 FileReader Object BufferedWriter Writer OutputStreamWriter FileWriter PrintWriter 書き出し用 入出力に関するクラスの構成図 基本となるクラス (1) Reader クラス ( 読み込み ),Write クラス ( 書き出し ) (2)InputStreamReader クラス ( 読み込み ),OutputStreamWriter( 書き出し ) これらのサブクラスとして多くの入出力ストリームが定義されている ( 教科書 p190 図 14.1) サブクラスは次の 2 種類に分けられる データシンクストリームデータプロセスストリーム : メモリ, ファイルといったデータシンクからの入出力を行う : バッファリングやデータ変換などのデータ処理を伴う入出力 -1-
ストリームクラスの仕組みデータ入出力を行うための処理 1 io パッケージのストリームクラスのオブジェクトを作成 2 そのオブジェクトに対して読み書きメソッドを実行データの入出力先により, ストリームクラスが異なる点に注意 ストリームクラスのコンストラクタの引数にファイル, 配列 文字列 ストリームオブジェクトのいずれかを指定 入出力のプログラム作成例ファイルからデータの入力 ファイルから文字データを読み込む FileReader クラスの利用 ( 通常 デフォルトの大きさのバッファを使って文字データをファイルから読み込む ) ファイルから Fil ereader オブジェクトを経由して ( ストリームとして ) データを読み込む処理 1 Fil ereader オブジェクトの作成 ( ファイルの環境設定のためのオブジェクトの作成 ) ( 利用例 ) FileReader fil ein=newfil ereader( ファイル名 ); あるいは Fil e infil e=newfil e( ファイル名 ); Fil ereader filein=newfil ereader(infil e); 2 データの読み込み ( 一文字ごとの読み込み ) Fil ereader オブジェクトの read メソッドを実行 ( 利用例 ) char c; c=fil ein.read(); (c には読み込んだ文字が入る ) ファイルへデータを出力ファイルへ文字データを書き出す Fil ewriter クラスの利用 ファイルへ Fil ewriter オブジェクトを経由して ( ストリームとして ) データを書き出す処理 1 Fil ewriter オブジェクトの作成 ( 利用例 ) FileWriter fil eout=newfilewriter( ファイル名 ); 2 wrtite メソッドでデータの書き出し ( 一文字ずつ出力 ) ( 利用例 ) fil eout.write c ( ); Java 内部では文字を 16 ビットの Unicode エンコーディングに従って表している 文字ストリームクラスで Reader, Writer クラスは抽象クラスである ( 継承するクラスによって各メソッドが定義される ) -2-
ストリームオブジェクトの機能拡張 ストリームオブジェクトを別のストリームクラスに接続することでストリームオブジェクトの機能を拡張する read( ) FileReader メソッド 1 文字ずつのファイルオブジェクト読み込みデータ BufferedReader オブジェクト readline() メソッド 1 行ずつの 読み込みデータ ストリームオブジェクトの機能拡張 ( 拡張の例 ) (1) ファイルから1 行ごとにデータを読む込む場合 Fil ereader クラスに 1 行ごとにデータを読むメソッドはない BuferedReader クラスの利用 (readline() の利用 ) BuferedReader クラスの入力元を FileReader オブジェクトにする BuferedReader クラスのコンストラクタの引数に Fil ereader オブジェクトを指定 FileReader ストリームを BufferedReader ストリームに接続することに相当 ファイルからデータを FileReader オブジェクト BufferedReader オブジェクト (readline( ) メソッド ) 経由して取り出す => 機能拡張に対応 ereaderfr=newfil ereader( XYZ.dat ); BuferedReaderbr=newBufferedReader(fr); Stringstr=br.readLine( ;) // 読み込み (2) ファイルへ1 行ごとにデータを書き出す場合 ewriterfw=newfil ewriter( ABC.dat ); BuferedWriterbw=newBufferedWriter(fw); br.write( 文字列 ); // 書き出し BuferedReader, BufferedWriter クラスではバッファリング ( 入出力するデータを一時ためておくこと ) により, データの読み込み, 書き出しが効率的に行われる. -3-
プログラム例ファイルの読み込み バッファ付き文字ストリームの利用 BufferedReader の利用例 ( ファイルからの読み込み ) 1: import java.io.*; 2: class BufferedReaderDemo { 3: public static void main(string args[ ]) { 4: try { 5: // FileReader オブジェクトを作成する 6: FileReader fr = new FileReader(args[0]); 7: // BufferedReader オブジェクトを作成する 8: BufferedReader br = new BufferedReader(fr); 9: // ファイルに行を読み込んで, 表示する 10: String s; 11: while((s =br.readline( ))!= null) 12: System.out.println(s); 13: 14: // FileReader オブジェクトをクローズする 15: fr.close( ); 16: } 17: catch(exception e) { 18: System.out.println("Exception: " + e); 19: } 20: } 21:} 実行例 ( コンソール画面上で ) java BufferedWriterDemo FileIn.dat ストリーム用コンポーネントの import 1 行分の文字列格納用変数 ファイルのオープンを含む 実行時のコマンドによる引数はここで設定されている BufferedReader の引数は FileReader のオブジェクト Buff eredreader のオブジェクト メソッド readline() により, 1 行ごとに読み込んで文字列クラスのオブジェクト s に格納 ( ファイルの最後には nul が入る ) 画面上に s を出力 ( 表示 ) Fil ereader オブジェクトの fr に対して close 処理 ( ファイルのクローズ ) Fil ein.dat の内容 ABCDEFG HIJKLMN 一致 実行結果 ( 画面上の表示 ) ABCDEFG HIJKLMN -4-
ファイルの書き出し バッファ付き文字ストリームの利用 BufferedWriter の利用例 ( ファイルへの書き出し ) 1: import java.io.*; 2: class BufferedWriterDemo { 3: public static void main(string args[ ]) { 4: try { 5: // FileWriter オブジェクトを作成する 6: FileWriter fw = new FileWriter(args[0]); 7: // BufferedWriter オブジェクトを作成する 8: BufferedWriter bw = new BufferedWriter(fw); 9: // ファイルに文字列を書き込む 10: for( int i= 0; i<12; i++){ 11: bw.write( Line + i + n ); 12: } 13: 14: // BufferedWriter オブジェクトをクローズする 15: bw.close( ); 16: } 17: catch(exception e) { 18: System.out.println("Exception: " + e); 19: } 20: } 21: } ストリーム用コンポーネントの import 実行時の引数に出力ファイル名を設定するので, ここには出力ファイル名が入る 引数は FileWriter オブジェクト (FileWriter からの拡張 ) BufferedWriter のオブジェクトに対して, 書き出し命令 BuferedWriter のオブジェクトに対してクローズ命令 ( ファイルのクローズ ) 実行例 ( コンソール画面上で ) java BufferedWriterDemo FileOut.dat ( 実行後 ) <FileOut.dat 内で > Line 0 Line 1 Line 11-5-
文字ストリーム [1] ファイルのコピー ( ファイルからデータを読み込み, 別ファイル名のファイルに書き出す ) Fil ereader オブジェクト,Fil ewriter オブジェクトの作成コンストラクタの引数にファイル名またはファイル名と結び付けられた Fil eオブジェクトを指定 fil ein=newfil ereader( 入力ファイル名 ); 入出力にデフォルトのエンコード, バッファサイズを利用デフォルトを変更したい場合は InputStreamReader, OutputStreamWriter を使う test.data copy.data へデータのコピー 1 copy.data の作成 (copy.data ファイルのオープン ), [2] ファイルの終わりまで 1 行ずつ読む 2 test.data からデータの読み込み, BuferedReader クラスの readline( を使う ) 3 copy.data へデータの書き出し (1 文字ごとにコピーを実行 ) プログラム例 ( 一部 ) 1:inta; 2 2:try{ 3: fil ein = newfil ereader( test.data ); 4: fil eout= newfil ewriter( copy.data ); 5: whil e((a=fil ein.read( =-1){ ))! 6: fil eout.write(a); 7: } 8: fil ein.close( ); 9: fil eout.close (; ) 10:}catch(IOExceptione){ } 3 1 ファイルの情報の格納とファイルのオープン ファイルのクローズ 例外処理 ファイル list.data から 1 行分ずつ読み込み, 配列 entry[] に格納していく. 1 ストリームの設定 2 1 行ずつファイルからデータを読み込み 3 1 行分のデータを配列に格納 4 ファイルのクローズ プログラム例 ( 一部 ) 1:Stringentry[]; 2:Buff eredreaderdin; 3:try{ 4: din=newbuff eredreader(newfil ereader( li st.data )); 5: inti=0; 6: whil e((entry[i]=din.readline( =null ))! ){ 7: i++; 8: } 2,3 9: din.close( ;) 10:}catch(IOExceptione){ } 4 ファイルのクローズ 1 行分を格納するための文字列型配列 ( 配列の一つに 1 行分の文字列が入る ) 1 ファイルのオープンとストリームの設定 (FileReader と BufferedReader による入力ファイルの設定 (BufferedReade のオブジェクトを作成 ) ) 1 行ずつファイルから読み込み, 配列 entry に (1 行分の文字列を ) 格納する ( ファイルの最後では nul が入る ) -6-
[3] キーボードからの文字データの読み込み 標準入出力に対するアクセス手段 System クラスで提供されている. 標準入力 (System.in) キーボードから入力 標準出力 (System.out) 画面 (CRT) 上への出力 キーボードからの入力をプログラムに読み込む System.in には InputStreamReader クラスの接続 (System.in はバイトストリームのオブジェクトのためデータをバイトコードから文字に変換する必要がある ) ( 例 )InputStreamReader myji =newinputstreamreader(system.in) StreamTokenizer クラス 重要 StreamTokenizer クラスは文字ストリームからデータを解析してトークンの列を生成する. トークンを利用することで, 複雑な処理を文字, 数値などどのようなタイプのデータでもまとめて扱える. トークン : 数字列または単語を表す文字列のグループ. トークンを評価することにより, 適切な処理を行える StreamTokenizer クラスのコンストラクタ StreamTokenizer( Readerr) StreamTokenizer のオブジェクトがトークン ( および, トークンの情報 ) となる 4 つの定数 :TT_EOF( ファイルの終わり状態 ),TT_EOL( 行の終わり ), TT_NUMBER( 数字の読み込み判定 ),TT_WORD( 単語の読み取り判定 ) 3 つのインスタンス変数とトークンの関係 : トークンが数字の場合 : nval に数字が入る, ttype は TT_NUMBER となるトークンが文字列の場合 : sval に文字列カ 入る, ttype は TT_WORD となる StreamTokenizer クラスを使用する手順 1 読み込み用の StreamTokenizer オブジェクトを作成する 2 文字を処理する方法を定義する 3 nexttoken( ) を呼び出して次のトークン ( 文字列 に相当 ) を取得する 4 ttype インスタンス変数を読み取り, トークンの値を読み取る 5 sval, nval または ttype インスタンス変数からトークンの型を判断する 6 トークンを処理する 7 nexttoken( ) が StreamTokenizer.TT_EOF を返すまでステップ 3~6 を繰り返す ( プログラム例は次ページ ) -7-
StreamTokenizer を利用したプログラム ( テキストファイルを読み取って その内容を解析するプログラム ) < 独習 Javap336 より > 1:importjava.io.*; 2:classStreamTokenizerDemo{ 3: publi cstaticvoidmain(stringargs[]) { 4: try{ 5: //Fil ereader オブジェクトを作成する 6: Fil ereaderfr=newfilereader(args[0]); 7: //Buff eredreader オブジェクトを作成する 8: Buff eredreaderbr=newbuferedreader(fr); 9: //StreamTokenizer オブジェクトを作成する 10: StreamTokenizerst=newStreamTokenizer(br); 11: 12: // ピリオドを通常文字として定義する 13: st.ordinarychar('.') ; 1 14: 2 15: // アポストロフを単語文字として定義する 16: st.wordchars(' '', ' '') ; 17: 18: // トークンを処理する 19: whil e(st.nexttoken() =StreamTokenizer.TT_EOF)! { 20: switch(st.ttype) { 21: casestreamtokenizer.tt_word: 3,7 22: System.out.println(st.li neno( ) +") "+ st.sval); 24: break; 25: casestreamtokenizer.tt_number: 26: System.out.println(st.li neno( ) +") "+ st.nval); 4 27: break; 28: default: 29: System.out.println(st.li neno( ) +") "+ (char)st.ttype); 30: } 31: } 32: 33: //Fil ereader オブジェクトをクローズする 34: fr.close(); 行番号を返す 35: } メソッド 36: catch (Exceptione) { 37: System.out.println("Exception: "+e); 38: } 39: } 40:} 実行時の引数としてファイル名を設定 Fil ereader オブジェクトの作成 Buff eredreader オブジェクトの作成 ( 引数は Fil ereader オブジェクト ) StreamTokenizer オブジェクトの作成 ( 引数は BuferedReader オブジェクト ) トークンの処理の設定 トークンの取得とファイルの最後かのチェック switch 文を使い, StreamTokenizer オブジェクトの ttype 変数によってトークンの種類をチェックし, 種類によって異なる処理を行っている 5 トークン内の文字および数字を表示 Fil ereader オブジェクトによってファイルを close ファイル tokens.txt には次の行が入っているとする ThePriceis$23.45. Isthattooexpensive 実行 ( コンソール画面上で以下のように処理 ) java StreamTokenizerDemo tokens.txt 結果 ( 画面表示 ) 1) The 1) Price 1) is 1) $ 1) 23.45 1). 2) Is 2) that 2) too 2) expensive -8-