第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) Fileのメソッドを使用した例 import java.io.*; catch(Exception e){ class FileDemo{ e.printStackTrace(); public static void main(String args[]){ } try{ System.out.println("pathSeparatorChar = " + } } File.pathSeparatorChar); System.out.println("SeparatorChar = " + File.SeparatorChar); >java FileDemo c:\tyj\examples\io\FileDemo.java pathSeparatorChar = ; File file = new File(args[0]); SeparatorChar = \ System.out.println("getName() = " + getName() = FileDemo.java file.getName()); System.out.println("getPath() = " + file.getPath()); System.out.println("canRead() = " + file.canRead()); System.out.println("canWrite() = " + file.canWrite()); } getPath() = c:\tyj\examples\io\FileDemo.java canRead() = true canWrite() = true 11.2 文字ストリーム(1) ストリーム データのソース(源流)またはデスティネーション(宛先)の抽象的な概念のこと。 文字ストリームとバイトストリームの2つのタイプがある。 バイトストリーム バイナリデータの読み取りおよび書き込みを行うことができる。 文字ストリーム 文字および文字列のデータの読み取りおよび書き込みを行うことができる。 入力文字ストリームはバイトを文字に変換し、出力文字ストリームは文字をバイトに変換。 BufferedReader Reader InputStreamReader FileReader Object BufferedWriter Writer Java.ioパッケージで提供される文字ストリーム InputStreamWriter PrintWriter FileWriter 11.2 文字ストリーム(2) Writerクラス すべての文字出力ストリームで利用できる機能が定義される。 Writerコンストラクタ Writer() Writer(Object obj) 1つ目の形式は、Writeオブジェクトに基づいて同期化を行う。 2つ目の形式は、objに基づいて同期化を行う。 Writeクラスのインスタンスメソッド Abstract void close() い) throws IOException 出力ストリームをクローズする(サブクラスで実装しなければならな void write(int c) throws IOException ストリームにc の下位16ビットを書き込む void write(String s) throws IOException ストリームにs を書き込む 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() throws IOException 入力ストリームをクローズする さらに読み取りをするとIOException (サブクラスで実装しなければならない) void mark(int numChars) throws IOException numChars文字が読み取られるまで有効である入力ストリー ムの現行の位置にマークをつける Boolean markSupported() mark() / reset() がこのストリームでサポートされている場合、真を返す int read() throws IOException ストリームから文字を読み取る データが利用可能になるまで待機する boolean ready() throws IOException 次のread()が待機していない場合、真を返す void reset() throws IOException 入力ポインタを、事前に設定されているマークにリセットする int skip(long numChars) throws IOException 入力のうちのnumCharsバイトを飛ばし、実際に飛ばした文字数を返す 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を投げる。 11.2 文字ストリーム(8) ファイル作成プログラムとファイル読み取りプログラムの例 import java.io.*; import java.io.*; class FileWriterDemo{ class FileReaderDemo{ public static void main(String args[]){ public static void main(String args[]){ try{ >java FileWriterDemo output.txt >java FileReaderDemo output.txt try{ FileWriter fw = new FileWriter(args[0]); FileReader fr = new FileReader(args[0]); Line 0 Line 1 for(int i=0;i<12;i++){ fw.write("Line " + i + "\n"); int i; Line 2 while((i = fr.read()) != -1){ Line 3 System.out.print((char)i); Line 4 } } fw.close(); Line 5 Line 6 } fr.close(); catch(Exception e){ System.out.println("Exception: " + e); } Line 8 catch(Exception e){ Line 9 } System.out.println("Exception: " + e); } } } } } Line 7 Line 10 Line 11 11.3 バッファ付き文字ストリーム(1) BufferedWriterクラス Writerを拡張したクラス。文字ストリームへの出力をバッファに入れる。 BufferedWriterコンストラクタ BufferedWriter(Writer w) BufferedWriter(Writer w, int bufSize) 1つ目の形式は、既定サイズのバッファを使用してバッファ付きストリームを作成する。 2つ目の形式は、バッファのサイズをbufSizeで指定する。 BufferedWriterのメソッド void newLine() throws IOException 改行文字を出力する 11.3 バッファ付き文字ストリーム(2) BufferedReaderクラス Readerを拡張したクラス。文字ストリームからの入力をバッファに入れる。 BufferedReaderコンストラクタ BufferedReader(Reader r) BufferedReader(Reader r, int bufSize) 1つ目の形式は、既定サイズのバッファを使用してバッファ付きストリームを作成する。 2つ目の形式は、バッファのサイズをbufSizeで指定する。 BufferedReaderのメソッド String readLine() throws IOException 文字ストリームから 改行終端文字列を読み取る 11.3 バッファ付き文字ストリーム(3) バッファ付き文字ストリームを用いたファイル作成プログラムとファイル読み取りプログラムの例 import java.io.*; import java.io.*; class BufferedWriterDemo{ class BufferedReaderDemo{ public static void main(String args[]){ public static void main(String args[]){ try{ >java FileWriterDemo output.txt >java FileReaderDemo output.txt try{ FileWriter fw = new FileWriter(args[0]); FileReader fr = new FileReader(args[0]); Line 0 Line 1 BufferedWriter bw = new BufferedWriter(fw); BufferedReader br = new BufferedReader(fr); Line 3 for(int i=0;i<12;i++){ String s; Line 4 while((s = br.readLine()) != null){ Line 5 bw.write("Line " + i + "\n"); System.out.println(s); } bw.close(); } catch(Exception e){ } Line 7 fr.close(); Line 8 Line 9 catch(Exception e){ Line 10 System.out.println("Exception: " + e); } } } } } Line 6 } System.out.println("Exception: " + e); } Line 2 Line 11 練習問題 1. >Java SampleWrite output.txt 10000 上記のように実行すると 「ガウス分布に従う乱数のサンプル、10000個のデータを持つoutput.txtというファイルを作成する」 といったプログラムを作成せよ。 また、 output.txt の1行目にはサンプル数を書き込むようにする。 2行目以降から、1行ごとにデータの値1つが書き込まれるようにする。 2. 作成したデータoutput.txtを読み込んでサンプル数、平均、分散を表示させるプログラムを作成せよ。 実行例 >Java SampleRead output.txt サンプル数:10000 平均:0.0020024006550653857 分散:1.0036122768136495 3. 英文のテキストファイルを読み取り、母音のアルファベット(a,i,u,e,o)が何回出現したかを 計算するプログラムを作成せよ。大文字・小文字の区別はしなくてよい。
© Copyright 2025 ExpyDoc