JavaのDataInputStreamについて
JavaのDataInputStream
クラスは、Java I/Oパッケージの一部であり、基本データ型(int、float、double、booleanなど)や文字列を入力ストリームから効率的に読み取るために設計されたクラスです。
これは、FilterInputStream
クラスを拡張しており、既存のInputStream
に追加機能を提供します。
主にバイトストリームをデータ型に変換する際に役立ちます。
主な特徴
DataInputStream
には以下の特徴があります。
-
基本データ型のサポート:
readInt()
、readDouble()
、readBoolean()
などのメソッドを使用して、基本的なデータ型を効率的に読み取ることができます。 -
バイト順序の制御: Javaの
DataInputStream
はデフォルトでビッグエンディアン形式(最上位バイトが最初)を使用します。 -
UTF文字列のサポート:
readUTF()
メソッドを使用してUTF形式でエンコードされた文字列を読み取ることができます。 -
ストリームチェーンの一部として使用: 他のストリーム(例:
FileInputStream
)と組み合わせて使用します。
使用方法
DataInputStream
を使用するには、FileInputStream
やByteArrayInputStream
などの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();
}
}
}
制限事項と注意点
-
エラー処理: 読み取るデータの型と順序が正しく一致していない場合、
EOFException
やIOException
がスローされます。 -
データフォーマットの互換性: ファイルに書き込まれたデータのフォーマットが
DataInputStream
の期待する形式でない場合、正しく読み取れません。 -
エンディアン問題:
DataInputStream
はデフォルトでビッグエンディアンを使用するため、リトルエンディアンデータを扱う場合には別のライブラリや変換が必要です。
まとめ
DataInputStream
は、バイトストリームから基本データ型や文字列を効率的に読み取るための便利なクラスです。
ファイルやネットワークソケットからのデータ読み取りで広く使用されますが、データ形式や順序の注意が必要です。
複雑なバイナリデータの処理には、DataInputStream
を使用して、JavaのI/O操作を簡素化できます。