Arquivos Binários em Java

De Aulas

Afluentes: Programação em Java

Arquivos Binários

  • Usados para gravar informações complexas
  • São um grupo de registros relacionados (ou objetos)
  • Um registro é a menor quantidade de informação que pode ser lida ou escrita de um arquivo binário
  • Todos os registros de um arquivo binário têm a mesma estrutura
  • Em Java, dizemos que armazenam objetos serializados
  • Registro: formado por vários campos relacionados (ex. classe no java)
  • Campo: armazena uma sequência de bytes Informação que tem algum significado no domínio do problema (ex. variável)
Vantagens
  • Os objetos são mais facilmente gravados e recuperados
  • Gravação é geralmente mais rápida
Desvantagens
  • Mais difícil de serem manipulados
  • Somente pode ser lido pelo programa que o gravou

Arquivos Sequenciais

  • Tanto arquivo de texto quanto arquivos binários são gravados e acessados sequencialmente
  • No arquivo de texto, um caractere é gravado após o outro
  • No arquivo binário, um registro (ou objeto) é gravado após o outro
  • Java vê cada arquivo como um fluxo sequencial de bytes
Java ArquivoBinario hierariquia.png

Serialização de Objetos

  • Serve para gravar um objeto inteiro em disco
  • Não serve apenas informações textuais
  • No java utilizamos mecanísmos de serialização
  • Um objeto serializado é representado por uma sequência de bytes
  • Um objeto serializado pode ser gravado em disco e recuperado posteriormente
  • ObjectInputStream:
    • Permite que objetos seja lidos do disco
    • Os objetos devem ter sido gravados pela classe ObjectOutputStream
    • Método principal: readObject()
  • ObjectOutputStream:
    • Permite gravar objetos em disco como um fluxo de bytes
    • Método principal: writeObject()

Exemplo

Student

Objeto de transferência, serializável, armazena informações de um registro.

 1import java.io.Serializable;
 2
 3public class Student implements Serializable {
 4    private static final long serialVersionUID = 1L;
 5    private String name = "";
 6    private boolean active = true;
 7    private int score = 0;
 8
 9    public Student(String name, boolean active, int score) {
10        setName(name);
11        setActive(active);
12        setScore(score);
13    }
14
15    public String getName() {
16        return name;
17    }
18
19    public void setName(String name) {
20        this.name = name;
21    }
22
23    public void setActive(Boolean active) {
24        this.active = active;
25    }
26
27    public boolean isActive() {
28        return active;
29    }
30
31    public void setScore(int score) {
32        this.score = score;
33    }
34
35    public int getScore() {
36        return score;
37    }
38}

StudentData

Classe para gerenciamento da leitura e escrita dos registros em arquivo.

 1import java.io.FileInputStream;
 2import java.io.FileOutputStream;
 3import java.io.IOException;
 4import java.io.ObjectInputStream;
 5import java.io.ObjectOutputStream;
 6import java.util.List;
 7import java.util.ArrayList;
 8
 9public class StudentData {
10    private String filename = "out.dat";
11
12    public StudentData(String filename) {
13        this.filename = filename;
14    }
15
16    public void save(List<Student> students) {
17        try {
18            ObjectOutputStream file = new ObjectOutputStream(new FileOutputStream(filename));
19            for (Student student : students) {
20                file.writeObject(student);
21            }
22            file.close();
23        } catch (IOException e) {
24            System.out.println(e.getMessage());
25        }
26    }
27
28    public List<Student> load() {
29        List<Student> students = new ArrayList<Student>();
30        try {
31            Student student = null;
32            ObjectInputStream file = new ObjectInputStream(new FileInputStream(filename));
33            do {
34                student = (Student) file.readObject();
35                if (student != null) {
36                    students.add(student);
37                }
38            } while (student != null);
39            file.close();
40        } catch (IOException e) {
41            System.out.println(e.getMessage());
42        } catch (ClassNotFoundException e) {
43            System.out.println(e.getMessage());
44        }
45        return students;
46    }
47}

Main

Classe para gerenciamento dos dados.

 1import java.util.List;
 2import java.util.Scanner;
 3
 4public class Main {
 5    public static void main(String[] args) {
 6        Scanner scan = new Scanner(System.in);
 7        StudentData data = new StudentData("student.dat");
 8        List<Student> students = data.load();
 9
10        System.out.println("----[ CADASTRO DE ESTUDANTES ]---------------");
11        int opc = -1;
12        while (opc != 0) {
13            System.out.println("----------------------------------------------");
14            System.out.println("1 Listar | 2 Incluir | 3 Excluir Tudo | 0 Sair");
15            System.out.print("Opção: ");
16            opc = Integer.parseInt(scan.nextLine());
17            switch (opc) {
18                case 1: // Lista os estudantes
19                    for (Student student : students) {
20                        String active = student.isActive() ? "+ " : "- ";
21                        System.out.println(active + student.getName() + ", " + student.getScore());
22                    }
23                    break;
24                case 2:
25                    System.out.print("Nome: ");
26                    String name = scan.nextLine();
27                    System.out.print("Ativo [1 ou 0]: ");
28                    boolean active = Integer.parseInt(scan.nextLine()) == 0 ? false : true;
29                    System.out.print("Pontos: ");
30                    int score = Integer.parseInt(scan.nextLine());
31                    students.add(new Student(name, active, score));
32                    break;
33                case 3:
34                    students.clear();
35            }
36        }
37        data.save(students);
38    }
39}