Классы DataOutputStream и DataInputStream позволяют записывать и считывать данные примитивных типов.
Класс DataOutputStream представляет поток вывода и предназначен для записи данных примитивных типов, таких, как int, double и т.д. Для записи каждого из примитивных типов предназначен свой метод:
writeBoolean(boolean v) : записывает в поток булевое однобайтовое значение
writeByte(int v): записывает в поток 1 байт, которые представлен в виде целочисленного значения
writeChar(int v): записывает 2-байтовое значение char
writeDouble(double v): записывает в поток 8-байтовое значение double
writeFloat(float v): записывает в поток 4-байтовое значение float
writeInt(int v): записывает в поток целочисленное значение int
writeLong(long v): записывает в поток значение long
writeShort(int v): записывает в поток значение short
writeUTF(String str): записывает в поток строку в кодировке UTF-8
Класс DataInputStream действует противоположным образом - он считывает из потока данные примитивных типов. Соответственно для каждого примитивного типа определен свой метод для считывания:
boolean readBoolean(): считывает из потока булевое однобайтовое значение
byte readByte(): считывает из потока 1 байт
char readChar(): считывает из потока значение char
double readDouble(): считывает из потока 8-байтовое значение double
float readFloat(): считывает из потока 4-байтовое значение float
int readInt(): считывает из потока целочисленное значение int
long readLong(): считывает из потока значение long
short readShort(): считывает значение short
String readUTF(): считывает из потока строку в кодировке UTF-8
int skipBytes(int n): пропускает при чтении из потока n байтов
Рассмотрим применение классов на примере:
import java.io.*; public class Program { public static void main(String[] args) { Person tom = new Person("Tom", 34, 1.68, false); // запись в файл try(DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.bin"))) { // записываем значения dos.writeUTF(tom.name); dos.writeInt(tom.age); dos.writeDouble(tom.height); dos.writeBoolean(tom.married); System.out.println("File has been written"); } catch(IOException ex){ System.out.println(ex.getMessage()); } // обратное считывание из файла try(DataInputStream dos = new DataInputStream(new FileInputStream("data.bin"))) { // записываем значения String name = dos.readUTF(); int age = dos.readInt(); double height = dos.readDouble(); boolean married = dos.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.height=h; this.age=a; this.married=m; } }
Здесь мы последовательно записываем в файл данные объекта Person.
Объект DataOutputStream в конструкторе принимает поток вывода: DataOutputStream (OutputStream out)
. В данном случае в качестве потока вывода
используется объект FileOutputStream
, поэтому вывод будет происходить в файл. И с помощью выше рассмотренных методов типа writeUTF()
производится запись значений в бинарный файл.
Затем происходит чтение ранее записанных данных. Объект DataInputStream в конструкторе принимает поток для чтения: DataInputStream(InputStream in)
.
Здесь таким потоком выступает объект FileInputStream