データの入出力
データの入出力
データをキーボードからコンピュータに入力することや CRT に表示すること,さらにハードディスク(HDD)や MO などに保存されているファイルからデータをコンピュータに読み込むことや(逆に)データをこれらの装置に保存 することデータ入出力用クラス
外部(キーボード,CRT,ファイル(HDD や MO など))からのデータの読み込み,書き出しのためのクラス
が 存在する →java.io パッケージ
データを入出力するための“
出入口
”を‘
ストリーム
’と言う.
(つまり、プログラムがデータを入出力するための 機能要素 が該当する)→ Java では
ストリームクラス
が提供され,このクラスによりデータのやり取りを行なう
データを入出力する手順
① ストリーム (すなわち,
ファイル
) を
オープン
する (通常、
1回
)
② データを
読み込む
,あるいは,
書き出す
③ ストリームを
クローズ
する (通常、
1回
)
(1) 文字単位のデータの入出力 文字ストリームクラス(16ビットの文字データ) (2) バイト単位のデータの入出力 バイトストリームクラス(イメージやバイナリデータ) Object Reader Writer InputStreamReader BufferedReader BufferedWriter OutputStreamWriter PrintWriter FileReader FileWriter 入出力に関するクラスの構成図書き出し用
読み込み用
基本となるクラス
(1) Reader クラス(読み込み),Write クラス(書き出し)
ストリームクラスの仕組み
データ入出力を行うための処理 ① io パッケージのストリームクラスのオブジェクトを作成 ② そのオブジェクトに対して読み書きメソッドを実行 データの入出力先により,ストリームクラスが異なる点に注意 → ストリームクラ スのコンストラ クタの引数にファイル ,配列、文字列、ストリ ームオブジェクトのいずれ かを指定入出力のプログラム作成例
ファイルからデータの入力
ファイルから文字データ
を読み込む →FileReader
クラスの利用 (通常、デフォルトの大きさのバッファを使って文字データをファイルから読み込む)① FileReader オブジェクトの作成(ファイルの環境設定のためのオブジェクトの作成)
(利用例) FileReader filein = ne w FileReader(“ファイル名”);あるいは
File inFile = new File(“ファイル名”); FileReader filein = new FileReader(inFile);
② データの読み込み
(一文字ごと
の読み込み) FileReader オブジェクトの read メソッドを実行 (利用例) char c; c = filein.read( ); ( c には読み込んだ文字が入る)ファイルへデータを出力
ファイルへ文字データ
を書き出す →FileWriter
クラスの利用① FileWriter オブジェクトの作成
(利用例) FileWriter fileout = new FileWriter(“ファイル名”);
② wrtite メソッドでデータの書き出し
(
一文字ずつ
出力)
(利用例) fileout.write ( c );ファイルから FileReader オブジェクトを経由して(ストリームとして)データを読み込む処理
ストリームオブジェクトの機能拡張 ・
ストリームオブジェクトを別のストリームクラスに接続
することでストリームオブジェクトの機能を拡張するFileReader
オブジェクト
BufferedReader
オブジェクト
read( ) メソッド readLine( ) メソッド ファイル 1文字ずつの 読み込みデータ 1行ずつの 読み込みデータ ストリームオブジェクトの機能拡張 (拡張の例)(1) ファイルから1行ごとにデータを読む込む場合
FileReader クラスに1行ごとにデータを読むメソッドはない → BufferedReader クラスの利用 ( readLine( ) の利用 )BufferedReader クラスの入力元を FileReader オブジェクトにする
→ BufferedReader クラスのコンストラクタの引数に FileReader オブジェクトを指定FileReader ストリームを BufferedReader ストリームに接続することに相当
ファイルからデータを“FileReader オブジェクト → BufferedReader オブジェクト(readLine( )メソッド)” 経由して取り出す =>
機能拡張に対応
FileReader fr = ne w FileReader(“XYZ.dat”);BufferedReader br = new BufferedReader(fr);
String str= br.readLine( ); // 読み込み
(2) ファイルへ1行ごとにデータを書き出す場合
FileWriter fw = new FileWriter(“ABC.dat”); BufferedWriter bw = new BufferedWriter(fw);
br.write(“文字列”); // 書き出し
※ BufferedReader, BufferedWriter クラ スでは
バッファリング
(入出力するデータを一時た
めておくこと)により,データの
読み込み,書き出しが効率的
に行われる
.プログラム例
ファイルの読み込み
〔バッファ付き文字ストリームの利用〕 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
実行結果(画面上の表示) ABCDEFG HIJKLMN FileIn.dat の内容 ABCDEFG HIJKLMN
一致
実行時 のコ マン ドに よ る引 数はここで設定されているBufferedReader の引数は
FileReader のオブジェクト
BufferedReader のオブジ ェクト メソッ ドreadLine( )
により, 1 行ごとに読み込んで文字列 クラスのオブジェクト s に格納 (ファイルの最後にはnull
が 入る) 画面上に s を出力(表示) FileReader オブジェクトの fr に対してclose
処理(ファイルのクローズ)
1行分の文字列格納用 変数ファイルの
オープンを含む
ストリーム用コンポーネント の importファイルの書き出し
〔バッファ付き文字ストリームの利用〕
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: } 実行例 (コンソール画面上で)
java BufferedWriterDemo FileOut.dat
ストリーム用コンポーネント の import 実行時 の引 数に 出力フ ァ イ ル名を設定するの で, ここに は出力ファイル名が入る
引数は FileWriter オブジェクト
(FileWriter からの拡張)
BufferedWriter のオブジ ェク トに 対してクローズ命令(ファイルのクローズ)
BufferedWriter のオブジェクトに
対して,書き出し命令
(実行後) <FileOut.dat 内で> Line 0 Line 1 … Line 11文字ストリーム
[1]ファイルのコピー
(ファイルからデータを読み込み,別ファイル名のファイルに書き出す)FileReader オブジェクト,FileWriter オブジェクトの作成
コンストラクタの引数にファイル名またはファイル名と結び付けられた File オブジェクトを指定 filein= new FileReader(“入力ファイル名”);
入出力にデフォルトのエンコード,バッファサイズを利用 デフォルトを変更したい場合は InputStreamReader, OutputStreamWriter を使う
[2]ファイルの終わりまで1行ずつ読む
BufferedReader クラスの readLine( ) を使う プログラム例(一部) 1: int a; 2: try{3: filein = new FileReader(“test.data”); 4: fileout = new FileWriter(“copy.data”); 5: while((a= filein.read( ))!=−1){ 6: fileout.write(a); 7: } 8: filein.close ( ); 9: fileout.close ( ); 10: }catch(IOException e){ } ファイルの情報の格納と ファイルのオープン ※
test.data → copy.data へデータのコピー
① copy.data の作成(copy.data ファイルのオープン), ② test.data からデータの読み込み, ③ copy.data へデータの書き出し (1 文字ごとにコピーを実行)ファイルのクローズ
例外処理 ① ② ③ プログラム例(一部) 1:String entry[ ]; 2: BufferedReader din; 3:try{4: din= new BufferedReader(new FileReader(“list.data”)); 5: int i=0; ファ イルのオープンとス ト リームの 設定 (FileReader と BufferedReader ※ファイル list.data から1行分ずつ読み込み,配列 entry[ ]に格納していく. ① ストリームの設定 ② 1行ずつファイルからデータを読み込み ③ 1行分のデータを配列に格納 ④ ファイルのク ローズ 1行分を格納するための文字列型配列 (配列の一つに1行分の文字列が入る)
[3]キーボードからの文字データの読み込み
標準入出力に対するアクセス手段 → System クラスで提供されている. 標準入力 (System.in) → キーボードから入力 標準出力 (System.out) → 画面 (CRT) 上への出力 キーボードからの入力をプログラムに読み込む System.in には InputStreamReader クラスの接続 (System.in はバイトストリームのオブジェクトのためデータをバイトコードから文字に変換する必要がある) (例) InputStreamReader myji= new InputStreamReader(System.in)StreamTokenizer クラス
【重要】
※ StreamTokenizer クラスは文字ストリームからデータを解析してトークンの列を生成
する. トークンを利用することで,複雑な処理を文字,数値などどのようなタイプのデータでもまとめて扱える.トークン
: 数字列または単語を表す文字列のグループ.トークンを評価することにより,
適切な処理を行える
StreamTokenizer クラスのコンストラクタ StreamTokenizer( Reader r ) StreamTokenizer のオブジェクトがトークン(および,トークンの情報)となる 4つの定数: TT_EOF (ファイルの終わり状態),TT_EOL (行の終わり), TT_NUMBER(数字の読み込み判定),TT_WORD(単語の読み取り判定) 3つのインスタンス変数とトークンの関係:トークンが
数字
の場合: nval に数字が入る, ttype は TT_NUMBER となる トークンが文字列
の場合: sval に文字列ガ入る, ttype は TT_WORD となる StreamTokenizer クラスを使用する手順① 読み込み用の StreamTokenizer オブジェクトを作成する ② 文字を処理する方法を定義する
③ nextToken( ) を呼び出して次のトークン(‘文字列’に相当)を取得する ④ ttype インスタンス変数を読み取り,トークンの値を読み取る
⑤ sval, nval または ttype インスタンス変数からトークンの型を判断する ⑥ トークンを処理する
⑦ nextToken( )が StreamTokenizer.TT_EOFを返すまでステップ③∼⑥を繰り返す
StreamTokenizer を利用したプログラム(テキストファイルを読み取って、その内容を解析するプログラム)
<独習 Java p336 より> 1: import java.io.*;
2: class StreamTokenizerDemo {
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: // StreamTokenizer オブジ ェクト を作成する
10: StreamTokenizer st = new StreamTokenizer(br); 11: 12: // ピリオドを通常文字として定義する 13: st.ordinaryChar('.'); 14: 15: // アポストロフを単語文字として定義する 16: st.wordChars('¥'', '¥''); 17: 18: // トークンを処理する
19: while( st.nextToken( ) != StreamTokenizer.TT_EOF) { 20: switch(st.ttype) { 21: case StreamTokenizer.TT_WORD: 22: System.out.println(st.lineno( ) + ") " + st.sval); 24: break; 25: case StreamTokenizer.TT_NUMBER: 26: System.out.println(st.lineno( ) + ") " + st.nval); 27: break; 28: default: 29: System.out.println(st.lineno( ) + ") " + (char)st.ttype); 30: } 31: } 32: 33: // FileReader オブジ ェクト をク ローズする 34: fr.close( ); 35: } 36: catch (Exception e) { 37: System.out.println("Exception: " + e); 38: } 39: } 40:} 実行時の引数として ファイル名を設定 FileReader オブジ ェク トの作成 BufferedReader オ ブ ジ ェ クトの作成 (引数は FileReader オ ブ ジェクト) StreamTokenizer オブジ ェ クトの作成 (引数は BufferedReader オブジ ェクト) トークンの処理の設定 FileReader オブジェクト によってファ イルを close ト ーク ンの 取得と ファ イ ル の最後かのチェック switch 文を使い, StreamTokenizer オブジ ェク トのttype 変数によってトーク ンの種類 をチェッ クし, 種類 によって 異な る処理を行って いる 行番号を返す メソッド トークン内の文字および 数字を表示 ② ③,⑦ ① ④ ⑤