文字ストリーム

Download Report

Transcript 文字ストリーム

第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)が何回出現したかを
計算するプログラムを作成せよ。大文字・小文字の区別はしなくてよい。