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");