Stream

Java IOまとめ

Java IO分類

①データの出所による分類

1.ファイル: FileInputStream / FileOutputStream、FileReader / FileWriter

2.byte[]: ByteArrayInputStream / ByteArrayOutputStream

3.Char[]: CharArrayReader / CharArrayWriter

4.String: StringBufferInputStream / StringBufferOutputStream、StringReader / StringWriter

5.ネット: InputStream / OutputStream、Reader / Writer

②フォーマットによる分類

1.フォーマット必要: PrintStream、PrintWriter

③バッファによる分類

1.バッファ必要: BufferedInputStream / BufferedOutputStream、BufferedReader / BufferedWriter

④データの書式による分類

1.二進法: InputStream / OutputStream 及び *Stream子クラス

2.テキスト: Reader / Writer 及び 子クラス

⑤入出力による分類

1.入力: Reader、InputStream 及び 子クラス

2.出力: Writer、OutputStream 及び 子クラス

⑥特殊場合

1.*Stream⇒Reader/Writer: InputStreamReader、OutputStreamWriter

2.オブジェクト: ObjectInputStream、ObjectOutputSteam

3.プロセス間通信: PipeInputStream / PipeOutputStream、PipeReader / PipeWriter

選択順番(特殊場合以外)

④⇒⑤⇒⑥(1.)⇒①⇒③⇒②

★Byte Stream vs. Character Stream

//Byte Stream (image type of data)

File file = new File("...");

FileOutputStream fos = new FileOutputStream(file);

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(fos));

out.write("...");

//Character Stream (text type of data)

FileWriter writer = new FileWriter("...");

BufferedWriter out = new BufferedWriter(writer);

out.write("...");

バイトストリームにより、ファイルの読み込み・書き込み

File inputFile = new File("C:\\temp\\in.txt");

File outputFile = new File("C:\\temp\\out.txt");

BufferedInputStream inputStream = null;

BufferedOutputStream outputStream = null;

try {

inputStream = new BufferedInputStream(new FileInputStream(inputFile));

outputStream = new BufferedOutputStream(new FileOutputStream(outputFile));

int bytes;

while( (bytes = inputStream.read()) != -1 ){

outputStream.write(bytes);

}

outputStream.flush();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} finally {

if(inputStream != null){

try {

inputStream.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if(outputStream != null){

try {

outputStream.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

new BufferedInputStream(new FileInputStream(inputFile), 10240);

※デフォルトのバッファサイズは8192byte

文字ストリームにより、ファイルの読み込み・書き込み

File inputFile = new File("C:\\temp\\in.txt");

File outputFile = new File("C:\\temp\\out.txt");

BufferedReader reader = null;

BufferedWriter writer = null;

try {

reader = new BufferedReader(new InputStreamReader

(new FileInputStream(inputFile), "UTF-8"));

//reader = new BufferedReader(new FileReader(inputFile));

writer = new BufferedWriter(new OutputStreamWriter

(new FileOutputStream(outputFile), "SJIS"));

//writer = new BufferedWriter(new FileWriter(outputFile));

String line = null;

while( (line = reader.readLine()) != null ){

writer.write(line);

writer.newLine();

}

writer.flush();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} finally {

if(reader != null){

try {

reader.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if(writer != null){

try {

writer.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

★ファイルの圧縮・解凍

File inputFile = new File("C:\\temp\\in.txt");

File outputFile = new File("C:\\temp\\out.txt");

DeflaterInputStream deflater = null;

DeflaterOutputStream inflater = null;

try {

deflater = new DeflaterInputStream(new FileInputStream(inputFile));

inflater = new DeflaterOutputStream(new FileOutputStream(outputFile));

int bytes;

while( (bytes = deflater.read()) != -1 ){

inflater.write(bytes);

}

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} finally {

if(deflater != null){

try {

deflater.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if(inflater != null){

try {

inflater.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

★Resetについて

reset()が呼び出されるまで、書き込まれるすべてのオブジェクトの参照を持ちつづけるため、

OutOfMemoryError が発生する可能性がある。

public void writeStream(Object input) throws IOException {

ObjectOutputStream stream =

new ObjectOutputStream(new FileOutputStream("output.txt"));

stream.writeObject(input);

stream.reset();

}

※但し、同じオブジェクトを繰り返し、ストリームに書き込む場合は、キャッシュされる機能を利用するため、reset()メソッドを呼ばないように

IOとDesign Pattern

Decorator Patternの例

FileInputStream fis = new FileInputStream("D://test.txt");

BufferedInputStream bis = new BufferedInputStream(fis);

BufferedInputStreamはDecoratorに相当

他にはDataInputStream、PipedInputStream、FilterInputStream、SequnceInputStreamなど

Adapter Patternの例

public class FileInputStream extends InputStream {

public FileInputStream(File file)

{

...

}

...

}

FileはAdapteeに相当

FileInputStreamはAdapterに相当

他にStringReader、DataInputStreamなど

Java IO 主なAPI

入力系バイトストリーム

BufferedInputStream(InputStream in)

BufferedInputStream(InputStream in, int size)

int read()

int read(byte[] b, int off, int len)

FileInputStream(File file)

FileInputStream(String name)

int read()

int read(byte[] b)

int read(byte[] b, int off, int len)

出力系バイトストリーム

BufferedOutputStream(OutputStream out)

BufferedOutputStream(OutputStream out, int size)

int write()

int write(byte[] b, int off, int len)

FileOutputStream(File file)

FileOutputStream(String name)

int write(int b)

int write(byte[] b)

int write(byte[] b, int off, int len)

入力系文字ストリーム

BufferedReader(Reader in)

BufferedReader(Reader in, int size)

int read()

int read(char[] b, int off, int len)

String readLine()

InputStreamReader(InputStream in)

InputStreamReader(InputStream in, Charset cs)

InputStreamReader(InputStream in, String encoding)

int read()

int read(char[] b, int off, int len)

FileReader(File file)

FileReader(String name)

int read()

int read(char[] b, int off, int len)

出力系文字ストリーム

BufferedWriter(Writer out)

BufferedWriter(Writer out, int size)

int write(int c)

int write(char[] c, int off, int len)

int write(String s, int off, int len)

OutputStreamWriter(OutputStream out)

OutputStreamWriter(OutputStream out, Charset cs)

OutputStreamWriter(OutputStream out, String encoding)

int write(int c)

int write(char[] c, int off, int len)

int write(String s, int off, int len)

FileWriter(File file)

FileWriter(String name)

int write(int c)

int write(char[] c, int off, int len)

int write(String s, int off, int len)

★エンコードを指定すること

Reader r = new InputStreamReader(new FileInputStream(file), "ISO-8859-1");

Writer w = new OutputStreamWriter(new FileOutputStream(file), "ISO-8859-1");

Reader r = new InputStreamReader(inputStream, "UTF-8");

Writer w = new OutputStreamWriter(outputStream, "UTF-8");

String s = new String(byteArray, "ASCII");

byte[] a = string.getBytes("ASCII");