Clasele DataOutputStream și DataInputStream
Clasele DataOutputStream și DataInputStream permit scrierea și citirea datelor de tipuri primitiv.
Scrierea datelor cu DataOutputStream
Clasa DataOutputStream reprezintă un flux de ieșire și este destinată scrierii datelor de tipuri primitive, cum ar fi int, double, etc. Fiecare tip primitiv are metoda sa pentru scriere:
- writeBoolean(boolean v): scrie în flux o valoare booleană de un octet
- writeByte(int v): scrie un octet în flux, reprezentat ca valoare întreagă
- writeChar(int v): scrie o valoare char de 2 octeți
- writeDouble(double v): scrie o valoare double de 8 octeți
- writeFloat(float v): scrie o valoare float de 4 octeți
- writeInt(int v): scrie o valoare întreagă int
- writeLong(long v): scrie o valoare long
- writeShort(int v): scrie o valoare short
- writeUTF(String str): scrie un șir de caractere în codare UTF-8
Citirea datelor cu DataInputStream
Clasa DataInputStream funcționează invers - citește din flux date de tipuri primitive. Pentru fiecare tip primitiv există o metodă corespunzătoare de citire:
- boolean readBoolean(): citește o valoare booleană de un octet
- byte readByte(): citește un octet
- char readChar(): citește o valoare char
- double readDouble(): citește o valoare double de 8 octeți
- float readFloat(): citește o valoare float de 4 octeți
- int readInt(): citește o valoare întreagă int
- long readLong(): citește o valoare long
- short readShort(): citește o valoare short
- String readUTF(): citește un șir de caractere în codare UTF-8
- int skipBytes(int n): sărind peste n octeți în flux
Exemplu de utilizare a claselor DataOutputStream și DataInputStream
Să analizăm un exemplu:
import java.io.*;
public class Program {
public static void main(String[] args) {
Person tom = new Person("Tom", 34, 1.68, false);
// scrierea în fișier
try (DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.bin"))) {
// scriem valorile
dos.writeUTF(tom.name);
dos.writeInt(tom.age);
dos.writeDouble(tom.height);
dos.writeBoolean(tom.married);
System.out.println("Fișierul a fost scris");
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
// citirea inversă din fișier
try (DataInputStream dis = new DataInputStream(new FileInputStream("data.bin"))) {
// citim valorile
String name = dis.readUTF();
int age = dis.readInt();
double height = dis.readDouble();
boolean married = dis.readBoolean();
System.out.printf("Name: %s Age: %d Height: %f Married: %b", name, age, height, married);
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
}
}
class Person {
public String name;
public int age;
public double height;
public boolean married;
public Person(String n, int a, double h, boolean m) {
this.name = n;
this.age = a;
this.height = h;
this.married = m;
}
}
În acest exemplu, datele unui obiect Person sunt scrise secvențial într-un fișier.
Obiectul DataOutputStream primește în constructor un flux de ieșire: DataOutputStream(OutputStream out). În acest caz, fluxul de ieșire este un obiect FileOutputStream, deci ieșirea se face într-un fișier. Cu ajutorul metodelor prezentate mai sus, cum ar fi writeUTF(), valorile sunt scrise într-un fișier binar.
După aceea, citirea datelor are loc folosind DataInputStream, care primește un flux de intrare: DataInputStream(InputStream in), iar în acest caz, fluxul de intrare este FileInputStream.
Acest exemplu ilustrează cum putem scrie și citi date de tipuri primitive utilizând clasele DataOutputStream și DataInputStream.