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
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}