社会人のメモ帳

忘れたくないことアレコレ

【第5週】第5章:データの入出力を実装してみる【Java Gold合格へ向けて】

PREV | LIST | NEXT

基本データ型の入出力ストリームとは

読み書きの向きに応じて入力ストリーム出力ストリームに、読み書きを行うデータサイズに応じてバイトストリームキャラクタストリームに分類される。

クラス名 説明 キャラクタストリーム or バイトストリーム 入力ストリーム or 出力ストリーム
DataInputStream 基本データ型のデータを読み込めるストリーム バイト
ストリーム
入力
ストリーム
DataOutputStream 基本データ型のデータを書き出せるストリーム バイト
ストリーム
出力
ストリーム
BufferedReader char単位でバッファリングしながら読み込むストリーム キャラク
ストリーム
入力
ストリーム
BufferedWriter char単位でバッファリングしながら書き出すストリーム キャラク
ストリーム
出力
ストリーム

基本データ型の入出力を実装してみる

DataInputStream,DataOutputStream

pngファイルのコピー(読み出して、読み出したデータをそのまま書き出す)を行う。実施には下記のブログ主が適当に作った画像を利用する。

test.jpg

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)

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はテキストデータの扱いに特化しているようです。とはいえ、それぞれの使い方等に差異はなく、理解にはそれほど時間はかからないように思う。これまで実装して動かすだけであったが、問題としてどのように出されるのかいまいち分からないので、対応できるようにしていく必要があるように感じた。