This repository has been archived by the owner on Apr 24, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ArquivoIndexado.java
107 lines (96 loc) · 3.07 KB
/
ArquivoIndexado.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import java.io.*;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
class ArquivoIndexado<T extends Registro>
{
private RandomAccessFile arquivo;
private final Constructor<T> construtor;
private HashExtensivel indice;
public ArquivoIndexado(Constructor<T> c, String n) throws Exception
{
construtor = c;
File d = new File("dados");
if( !d.exists() )
d.mkdir();
arquivo = new RandomAccessFile("dados/"+ n, "rw");
if(arquivo.length()<4)
arquivo.writeInt(0);
String nomeDiretorio = "diretorio." + n;
String nomeListaCestos = "cestos." + n;
indice = new HashExtensivel(4, nomeDiretorio, nomeListaCestos);
}
public int incluir(T obj) throws Exception
{
this.arquivo.seek(0);
int ultimoID = this.arquivo.readInt();
ultimoID++;
arquivo.seek(0);
arquivo.writeInt(ultimoID);
arquivo.seek(arquivo.length());
long endereco = arquivo.getFilePointer();
obj.setID(ultimoID);
arquivo.writeByte(' '); // lapide
byte[] byteArray = obj.toByteArray();
arquivo.writeInt(byteArray.length); // indicador de tamanho do registro
arquivo.write(byteArray); // vetor de bytes que representa o registro
indice.insere(ultimoID, endereco);
return obj.getID();
}
// Metodo apenas para testes, pois geralmente a memoria principal raramente
// sera suficiente para manter todos os registros simultaneamente
public Object[] listar() throws Exception
{
ArrayList<T> lista = new ArrayList<>();
arquivo.seek(4);
byte lapide;
byte[] byteArray;
int s;
T obj;
while(arquivo.getFilePointer()<arquivo.length())
{
obj = construtor.newInstance();
lapide = arquivo.readByte();
s = arquivo.readInt();
byteArray = new byte[s];
arquivo.read(byteArray);
obj.fromByteArray(byteArray);
if(lapide==' ')
lista.add(obj);
}
return lista.toArray();
}
public Object buscar(int id) throws Exception
{
byte lapide;
byte[] byteArray;
int s;
T obj;
long endereco = indice.busca(id);
if(endereco!=-1)
{
obj = construtor.newInstance();
arquivo.seek(endereco);
lapide = arquivo.readByte();
s = arquivo.readInt();
byteArray = new byte[s];
arquivo.read(byteArray);
obj.fromByteArray(byteArray);
if(lapide==' ' && obj.getID()==id) // testes redundantes
return obj;
}
return null;
}
public boolean excluir(int id) throws Exception
{
long endereco = indice.busca(id);
if(endereco!=-1)
{
arquivo.seek(endereco);
arquivo.writeByte('*');
indice.remove(id);
return true;
}
else
return false;
}
}