第11回Javaゼミ 11.1 ファイルとディレクト リ 11.2 文字ストリーム 11.3 バッファ付き文字スト リーム 2006/06/28 神津 健太
11.1 ファイルとディレクトリ (1) File クラス ファイルまたはディレクトリのプロパティに関する情報をカプセル化。 プロパティには、読み取り及び書き込み許可、前回の修正時刻、および長さが含ま れる。 新しいディレクトリの作成、既存のファイルとディレクトリの削除、名前の変更な どができる。 File コンストラクタ File(String path) File(String directoryPath, String filename) File(File directory, String filename) 1つ目の形式は、ファイルまたはディレクトリのパスを指定。 2つ目の形式は、ディレクトリのパスと、そのディレクトリ内のファイル名。 3つ目の形式は、ディレクトリの File オブジェクトと、そのディレクトリ内のファイ ル名。 どのコンストラクタも path または filename が null の場合は NullPointException を投げる。
11.1 ファイルとディレクトリ (2) File クラス また、2つの char 定数、 eparatorChar と patheparatorChar が定義される 。 separatorChar ファイル名の中でディレクトリとファイルを区切る文字 pathseparatorChar パスリスト内で構成要素を区切る文字 File クラスのインスタンスメソッド boolean canRead() ファイルが存在し、読み取り可能なら真、可能でないなら偽を 返す boolean canWrite() ファイルが存在し、書き込み可能なら真、可能でないなら偽を 返す boolean createNewFile() 空の新規ファイルを作成。正しく作成されれば真、できなけれ ば偽 boolean delete() ファイルを削除。正しく削除されれば真、できなければ偽 ディレクトリは空でなければ削除できない String getAbsolutePath() ファイルの絶対パスを返す String getCanonicalPath() ファイルの標準パスを返す String getName() ファイルの名前を返す String getParent() ファイルの親を返す String getPath() ファイルのパスを返す
11.1 ファイルとディレクトリ (3) import java.io.*; class FileDemo{ public static void main(String args[]){ try{ System.out.println("pathSeparatorChar = " + File.pathSeparatorChar); System.out.println("SeparatorChar = " + File.SeparatorChar); File file = new File(args[0]); System.out.println("getName() = " + file.getName()); System.out.println("getPath() = " + file.getPath()); System.out.println("canRead() = " + file.canRead()); System.out.println("canWrite() = " + file.canWrite()); } catch(Exception e){ e.printStackTrace(); } >java FileDemo c:\tyj\examples\io\FileDemo.java pathSeparatorChar = ; SeparatorChar = \ getName() = FileDemo.java getPath() = c:\tyj\examples\io\FileDemo.java canRead() = true canWrite() = true File のメソッドを使用した例
11.2 文字ストリーム(1) ストリーム データのソース(源流)またはデスティネーション(宛先)の抽象的な概念のこと。 文字ストリームとバイトストリームの2つのタイプがある。 バイトストリーム バイナリデータの読み取りおよび書き込みを行うことができる。 文字ストリーム 文字および文字列のデータの読み取りおよび書き込みを行うことができる。 入力文字ストリームはバイトを文字に変換し、出力文字ストリームは文字をバイト に変換。 Java.io パッケージで提供される文字ストリーム Object PrintWriter InputStreamReader BufferedReader Reader WriterFileWriter FileReader BufferedWriter InputStreamWriter
11.2 文字ストリーム(2) Writer クラス すべての文字出力ストリームで利用できる機能が定義される。 Writer コンストラクタ Writer() Writer(Object obj) 1つ目の形式は、 Write オブジェクトに基づいて同期化を行う。 2つ目の形式は、 obj に基づいて同期化を行う。 Write クラスのインスタンスメソッド Abstract void close() 出力ストリームをクローズする(サブクラスで実装しなければ ならない) throws IOException void write(int c) ストリームに c の下位 16 ビットを書き込む throws IOException void write(String s) ストリームに s を書き込む throws IOException
11.2 文字ストリーム(3) OutputStreamWriter クラス Writer を拡張したクラス。文字のストリームをバイトのストリームに変換 する。 OutputStreamWriter コンストラクタ OutputStreamWriter(OutputStream os) OutputStreamWriter(OutputStream os, String encoding) os は出力ストリーム、 encoding は文字エンコーディングの名前。 1つ目の形式は、ユーザーマシンの既定の文字エンコーディングを使用する。 OutputStreamWriter のメソッド String getEncoding() 文字エンコーディングの名前を返す
11.2 文字ストリーム(4) FileWriter クラス OutputStreamWriter を拡張したクラス。ファイルに文字を出力する。 FileWriter コンストラクタ FileWriter(String filepath) throws IOException FileWriter(String filepath, boolean append) throws IOException FileWriter(File fileObj) throws IOException FileWriter(File fileObj, boolean append) throws IOException filepath はファイルの完全パス名、 fileObj はファイルを表す File オブジェクト。 append が真の場合は、文字はファイルの終わりに付加され、 偽の場合は、ファイルの既存のコンテンツを上書きする。
11.2 文字ストリーム(5) Reader クラス すべての文字入力ストリームで利用できる機能が定義される。 Reader クラスのインスタンスメソッド Abstract void close() 入力ストリームをクローズする さらに読み取りをすると IOException throws IOException (サブクラスで実装しなければならない) void mark(int numChars) numChars 文字が読み取られるまで有効である入力ストリー throws IOException ムの現行の位置にマークをつける Boolean markSupported()mark() / reset() がこのストリームでサポートされている場合、真を 返す int read() throws IOException ストリームから文字を読み取る データが利用可能になるまで待 機する boolean ready() 次の read() が待機していない場合、真を返す throws IOException void reset() throws IOException 入力ポインタを、事前に設定されているマークにリセットする int skip(long numChars) 入力のうちの numChars バイトを飛ばし、実際に飛ばした文字数を 返す throws IOException
11.2 文字ストリーム(6) InputStreamReader クラス Reader を拡張したクラス。バイトのストリームを文字のストリームに変換 する。 InputStreamReader コンストラクタ InputStreamReader(InputStream is) InputStreamReader(InputStream is, String encoding) is は入力ストリーム、 encoding は文字エンコーディングの名前。 1つ目の形式は、ユーザーマシンの既定の文字エンコーディングを使用する。 InputStreamReader のメソッド String getEncoding() 文字エンコーディングの名前を返す
11.2 文字ストリーム(7) FileReader クラス InputStreamReader を拡張したクラス。ファイルから文字を入力する。 FileReader コンストラクタ FileReader(String filepath) throws FileNotFoundException FileReader(File fileObj) throws FileNotFoundException filepath はファイルの完全パス名、 fileObj はファイルを表す File オブジェクト。 どちらもファイルが見つからない場合は FileNotFoundException を投げる。
import java.io.*; class FileWriterDemo{ public static void main(String args[]){ try{ FileWriter fw = new FileWriter(args[0]); for(int i=0;i<12;i++){ fw.write("Line " + i + "\n"); } fw.close(); } catch(Exception e){ System.out.println("Exception: " + e); } ファイル作成プログラムとファイル読み取りプログラムの例 import java.io.*; class FileReaderDemo{ public static void main(String args[]){ try{ FileReader fr = new FileReader(args[0]); int i; while((i = fr.read()) != -1){ System.out.print((char)i); } fr.close(); } catch(Exception e){ System.out.println("Exception: " + e); } >java FileWriterDemo output.txt >java FileReaderDemo output.txt Line 0 Line 1 Line 2 Line 3 Line 4 Line 5 Line 6 Line 7 Line 8 Line 9 Line 10 Line 11 11.2 文字ストリーム(8)
11.3 バッファ付き文字ストリー ム(1) BufferedWriter クラス Writer を拡張したクラス。文字ストリームへの出力をバッファに入れる。 BufferedWriter コンストラクタ BufferedWriter(Writer w) BufferedWriter(Writer w, int bufSize) 1つ目の形式は、既定サイズのバッファを使用してバッファ付きストリームを作成す る。 2つ目の形式は、バッファのサイズを bufSize で指定する。 BufferedWriter のメソッド void newLine() throws IOException 改行文字を出力する
BufferedReader クラス Reader を拡張したクラス。文字ストリームからの入力をバッファに入れる。 BufferedReader コンストラクタ BufferedReader(Reader r) BufferedReader(Reader r, int bufSize) 1つ目の形式は、既定サイズのバッファを使用してバッファ付きストリームを作成す る。 2つ目の形式は、バッファのサイズを bufSize で指定する。 BufferedReader のメソッド String readLine() throws IOException 文字ストリームから 改行終端文字列を読み取る 11.3 バッファ付き文字ストリー ム(2)
11.3 バッファ付き文字ストリー ム(3) import java.io.*; class BufferedWriterDemo{ public static void main(String args[]){ try{ FileWriter fw = new FileWriter(args[0]); BufferedWriter bw = new BufferedWriter(fw); for(int i=0;i<12;i++){ bw.write("Line " + i + "\n"); } bw.close(); } catch(Exception e){ System.out.println("Exception: " + e); } バッファ付き文字ストリームを用いたファイル作成プログラムとファイル読み取りプロ グラムの例 import java.io.*; class BufferedReaderDemo{ public static void main(String args[]){ try{ FileReader fr = new FileReader(args[0]); BufferedReader br = new BufferedReader(fr); String s; while((s = br.readLine()) != null){ System.out.println(s); } fr.close(); } catch(Exception e){ System.out.println("Exception: " + e); } >java FileWriterDemo output.txt >java FileReaderDemo output.txt Line 0 Line 1 Line 2 Line 3 Line 4 Line 5 Line 6 Line 7 Line 8 Line 9 Line 10 Line 11
練習問題 1. >Java SampleWrite output.txt 上記のように実行すると 「ガウス分布に従う乱数のサンプル、10000個のデータを持つ output.txt というファイル を作成する」 といったプログラムを作成せよ。 また、 output.txt の1行目にはサンプル数を書き込むようにする。 2行目以降から、1行ごとにデータの値1つが書き込まれるようにする。 2.作成したデータ output.txt を読み込んでサンプル数、平均、分散を表示させるプログラムを作 成せよ。 実行例 >Java SampleRead output.txt サンプル数: 平均: 分散: 3.英文のテキストファイルを読み取り、母音のアルファベット( a,i,u,e,o )が何回出現したかを 計算するプログラムを作成せよ。大文字・小文字の区別はしなくてよい。