InputStreamReader/OutputStreamWriterクラス
テキストファイルの操作 – InputStreamReader/OutputStreamWriterクラス- InputStreamReader(InputStream in [,String char])
- OutputStreamWriter(OutputStream out [,String char])
- in:入力ストリーム
- out:出力ストリーム
- char:文字コード(UTF-8、EUC_JP、Windows-31J(Shift-JIS)など)
テキストファイルを読み書きするには、FileInputStream/FileOutputStreamクラスをInputStreamReader/OutputStreamWriterクラスで文字ストリーム(Reader/Writer)に変換します。それぞれのクラスで利用できるメソッドは、以下の通りです。
FileInputStream/FileOutputStreamクラスの主なメソッド | ||
---|---|---|
クラス | メソッド | 概要 |
FileInputStream | int read([byte[] b [,int off, int len]]) | 入力ストリームからバイト配列bに読み込み (offは開始位置、lenは読み込み長) |
long skip(long n) | 読み込みをnバイトだけスキップ | |
void close() | ストリームを閉じる | |
FileOutputStream | void write(byte[] b [,int off, int len] | バイト配列bの内容を出力ストリームに書き出し (offは開始位置、lenは読み込み長) |
void close() | ストリームを閉じる |
たとえば以下はsample.jpgを読み込み、その内容をそのままsample2.jpgに書きだす例です。
StreamBinary.java
package com.example.mynavi.stream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class StreamBinary { public static void main(String[] args) { try (FileInputStream in = new FileInputStream("C:/data/sample.jpg"); FileOutputStream out = new FileOutputStream("C:/data/sample2.jpg")) { int data; while ((data = in.read()) != -1) { out.write((byte) data); } } catch (IOException e) { e.printStackTrace(); } } }
FileInputStream/FileOutputStreamコンストラクターで操作対象のパスを指定することで、それぞれファイルを読み取り/書き込み専用で開けます。
ファイルからバイトデータを読み込むにはreadメソッドを利用します。readメソッドは、読み込みに成功した場合はその値を、読み込むべきデータがなかった場合には-1を返します。上では、その性質を利用して、readメソッドが-1を返すまでwhileループを繰り返すことで、ファイルの内容をすべて読み込めます。
バイトデータは、writeメソッドを利用することで、対象のファイルに書き込みます。
try-with-resource構文
ファイルなど共有のリソースを利用する際には、tryブロック直後のカッコで宣言します。これによって、リソースはtryブロックを抜けるタイミングで自動的に解放されますので、いわゆる「ファイルの閉じ忘れ」を防げます。この構文は、JavaSE 7で新たに追加された構文で、try-with-resources構文と呼ばれます。