JavaのDataInputStreamについて

JavaのDataInputStreamについて

JavaのDataInputStreamクラスは、Java I/Oパッケージの一部であり、基本データ型(int、float、double、booleanなど)や文字列を入力ストリームから効率的に読み取るために設計されたクラスです。 これは、FilterInputStreamクラスを拡張しており、既存のInputStreamに追加機能を提供します。 主にバイトストリームをデータ型に変換する際に役立ちます。

主な特徴

DataInputStreamには以下の特徴があります。

  • 基本データ型のサポート: readInt()readDouble()readBoolean()などのメソッドを使用して、基本的なデータ型を効率的に読み取ることができます。
  • バイト順序の制御: JavaのDataInputStreamはデフォルトでビッグエンディアン形式(最上位バイトが最初)を使用します。
  • UTF文字列のサポート: readUTF()メソッドを使用してUTF形式でエンコードされた文字列を読み取ることができます。
  • ストリームチェーンの一部として使用: 他のストリーム(例:FileInputStream)と組み合わせて使用します。

使用方法

DataInputStreamを使用するには、FileInputStreamByteArrayInputStreamなどのInputStreamオブジェクトをラップする形でインスタンスを作成します。


import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("data.bin");
        DataInputStream dis = new DataInputStream(fis);

        int number = dis.readInt();
        System.out.println("Number: " + number);

        dis.close();
    }
}
    

基本的な例

以下は、ファイルから整数値を読み取る基本的な例です。


import java.io.*;

public class BasicExample {
    public static void main(String[] args) {
        try (FileOutputStream fos = new FileOutputStream("example.bin");
             DataOutputStream dos = new DataOutputStream(fos)) {

            // 整数値を書き込み
            dos.writeInt(42);
        } catch (IOException e) {
            e.printStackTrace();
        }

        try (FileInputStream fis = new FileInputStream("example.bin");
             DataInputStream dis = new DataInputStream(fis)) {

            // 整数値を読み取り
            int value = dis.readInt();
            System.out.println("Read integer: " + value);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
    

複数データ型の読み取り例

複数のデータ型をファイルに書き込み、その後に読み取る例です。


import java.io.*;

public class MultipleDataExample {
    public static void main(String[] args) {
        try (FileOutputStream fos = new FileOutputStream("multiple.bin");
             DataOutputStream dos = new DataOutputStream(fos)) {

            dos.writeInt(123);
            dos.writeDouble(45.67);
            dos.writeBoolean(true);
            dos.writeUTF("Hello, DataInputStream!");
        } catch (IOException e) {
            e.printStackTrace();
        }

        try (FileInputStream fis = new FileInputStream("multiple.bin");
             DataInputStream dis = new DataInputStream(fis)) {

            int intValue = dis.readInt();
            double doubleValue = dis.readDouble();
            boolean booleanValue = dis.readBoolean();
            String utfString = dis.readUTF();

            System.out.println("Int: " + intValue);
            System.out.println("Double: " + doubleValue);
            System.out.println("Boolean: " + booleanValue);
            System.out.println("UTF String: " + utfString);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
    

制限事項と注意点

  • エラー処理: 読み取るデータの型と順序が正しく一致していない場合、EOFExceptionIOExceptionがスローされます。
  • データフォーマットの互換性: ファイルに書き込まれたデータのフォーマットがDataInputStreamの期待する形式でない場合、正しく読み取れません。
  • エンディアン問題: DataInputStreamはデフォルトでビッグエンディアンを使用するため、リトルエンディアンデータを扱う場合には別のライブラリや変換が必要です。

まとめ

DataInputStreamは、バイトストリームから基本データ型や文字列を効率的に読み取るための便利なクラスです。 ファイルやネットワークソケットからのデータ読み取りで広く使用されますが、データ形式や順序の注意が必要です。 複雑なバイナリデータの処理には、DataInputStreamを使用して、JavaのI/O操作を簡素化できます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です