基本データ型の入出力ストリームとは
読み書きの向きに応じて入力ストリームと出力ストリームに、読み書きを行うデータサイズに応じてバイトストリームとキャラクタストリームに分類される。
クラス名 | 説明 | キャラクタストリーム or バイトストリーム | 入力ストリーム or 出力ストリーム |
---|---|---|---|
DataInputStream | 基本データ型のデータを読み込めるストリーム | バイト ストリーム |
入力 ストリーム |
DataOutputStream | 基本データ型のデータを書き出せるストリーム | バイト ストリーム |
出力 ストリーム |
BufferedReader | char単位でバッファリングしながら読み込むストリーム | キャラクタ ストリーム |
入力 ストリーム |
BufferedWriter | char単位でバッファリングしながら書き出すストリーム | キャラクタ ストリーム |
出力 ストリーム |
基本データ型の入出力を実装してみる
DataInputStream,DataOutputStream
pngファイルのコピー(読み出して、読み出したデータをそのまま書き出す)を行う。実施には下記のブログ主が適当に作った画像を利用する。
public class Main { public static void main(String[] args) throws IOException { dataInOutStreamTest(); } static void dataInOutStreamTest() throws IOException { DataInputStream inputStream = null; DataOutputStream outputStream = null; try { byte[] b = new byte[4096]; int readByte = 0, totalByte = 0; inputStream = new DataInputStream( new BufferedInputStream( new FileInputStream("C: (ファイルパス) test.jpg"))); outputStream = new DataOutputStream( new BufferedOutputStream( new FileOutputStream("C: (ファイルパス) copy.jpg"))); while (-1 != (readByte = inputStream.read(b))) { outputStream.write(b, 0, readByte); totalByte += readByte; System.out.println("Read: " + readByte + " Total: " + totalByte); } } catch (IOException e) { System.out.println("エラー発生:" + e.getMessage()); } finally { if (Objects.nonNull(inputStream)) inputStream.close(); if (Objects.nonNull(outputStream)) outputStream.close(); System.out.println("ファイル クローズ済"); } } }
実行結果
Read: 4096 Total: 4096
Read: 4096 Total: 8192
Read: 4096 Total: 12288
Read: 4096 Total: 16384
Read: 4096 Total: 20480
Read: 1229 Total: 21709
ファイル クローズ済
実行結果(copy.jpg)
BufferedReader,BufferedWriter
テキストファイルのコピー(読み出して、読み出したデータをそのまま書き出す)を行う。内容としては「abcdef(改行コード)ABCDEF(改行コード)123456」
public class Main { public static void main(String[] args) throws IOException { dataReadWriteTest(); } static void dataReadWriteTest() throws IOException { BufferedReader bufferedReader = null; BufferedWriter bufferedWriter = null; try { byte[] b = new byte[4096]; String readLine; int count = 1; bufferedReader = new BufferedReader( new FileReader("C: (ファイルパス) testReader.txt")); bufferedWriter = new BufferedWriter( new FileWriter("C: (ファイルパス) testCopy.txt")); while (Objects.nonNull(readLine = bufferedReader.readLine())) { bufferedWriter.write(readLine); bufferedWriter.write("\n"); System.out.println(count+"行目"); count++; } } catch (IOException e) { System.out.println("エラー発生:" + e.getMessage()); } finally { if (Objects.nonNull(bufferedReader)) bufferedReader.close(); if (Objects.nonNull(bufferedWriter)) bufferedWriter.close(); System.out.println("ファイル クローズ済"); } } }
実行結果
1行目
2行目
3行目
ファイル クローズ済
実行結果(testCopy.txt)
abcdef ABCDEF 123456
まとめ
DataInputStream,DataOutputStreamは画像データなどまで扱うことができる一方、BufferedReader,BufferedWriterはテキストデータの扱いに特化しているようです。とはいえ、それぞれの使い方等に差異はなく、理解にはそれほど時間はかからないように思う。これまで実装して動かすだけであったが、問題としてどのように出されるのかいまいち分からないので、対応できるようにしていく必要があるように感じた。