Fiz um método que escreve em um arquivo sequencial, mas nao estou conseguindo fazer um que busque por um nome de registro.
Lembrando que este arquivo trabalha da seguinte maneira:
Ele pega a data de nascimento % 23, e o resultado entao será a posicao em que gravara o arquivo. Caso algum data coinscida com o resultado que ja tenha um registro, ele passa para o outro bloco (de 23) e grava o registro
Abaixo uns métodos importantes do sistema. O método pesquisarRegistro() está somente o esqueleto, se alguem conseguir me dar um ajuda.
ContatoRecord.java
/**
* Retornar o tamanho fixo do registro
* Cada caracter de uma String ocupa 02 bytes
* 60 bytes do nome
* 60 bytes do endereco
* 20 bytes da data de nascimento 99/99/9999
* 26 bytes do telefone (99)9999-9999
*
* @return tamanho do registro
*/
public static int size()
{
return 166;
}
public void read(RandomAccessFile file) throws IOException
{
// Ler o nome do contato
setNome(readString(30, file));
// Ler o endereco do contato
setEndereco(readString(30, file));
// Ler a data de nascimento do contato
setNascimento(readString(10, file));
// Ler o telefone do contato
setTelefone(readString(13, file));
}
private String readString(int tamanho, RandomAccessFile file) throws IOException
{
// Palavra a ser lida
char palavra[] = new char[tamanho];
// Caracter lido do arquivo
char temp;
// Ler 30 caracteres
for(int count = 0; count < palavra.length; count++)
{
// Ler um caracter do arquivo
temp = file.readChar();
// Concatenar com os caracteres lidos anteriormente
palavra[count] = temp;
}
// Retornar a palavra lida
return new String(palavra).replace('\0', ' ');
}
public void write(RandomAccessFile file) throws IOException
{
// Gravar o nome do contato
writeString(file, getNome(), 30);
// Gravar o endereco do contato
writeString(file, getEndereco(), 30);
// Gravar a data de nascimento do contato
writeString(file, getNascimento(), 10);
// Gravar o telefone do contato
writeString(file, getTelefone(), 13);
}
private void writeString(RandomAccessFile file, String palavra, int tamanho) throws IOException
{
// Buffer a ser gravado
StringBuffer buffer = null;
// Setar o valor do buffer
if(palavra != null)
{
buffer = new StringBuffer(palavra);
}
else
{
buffer = new StringBuffer(tamanho);
}
// Padronizar o tamanho da palavra
buffer.setLength(tamanho);
// Gravar a palavra no arquivo
file.writeChars(buffer.toString());
}
ContatoView.java
private void inserirRegistro() {
// Verificar se os campos foram preenchidos
if ((this.tfNome.getText() == null)
|| (this.tfNome.getText().equals(""))) {
JOptionPane.showMessageDialog(this, "Nome não foi preenchido!",
"Erro", JOptionPane.ERROR_MESSAGE);
return;
}
if ((this.tfEndereco.getText() == null)
|| (this.tfEndereco.getText().equals(""))) {
JOptionPane.showMessageDialog(this, "Endereço não foi preenchido!",
"Erro", JOptionPane.ERROR_MESSAGE);
return;
}
/*
* else if
* (searchRecord(Integer.parseInt(this.tfMatricula.getText()))){
* JOptionPane.showMessageDialog(this, "Matrícula já cadastrada!",
* "Erro", JOptionPane.ERROR_MESSAGE); return; }
*/
if ((this.tfNascimento.getText() == null)
|| (this.tfNascimento.getText().equals(""))) {
JOptionPane.showMessageDialog(this,
"Data de Nascimento não foi preenchida!", "Erro",
JOptionPane.ERROR_MESSAGE);
return;
} else if(!Data.validaData(this.tfNascimento.getText())){
JOptionPane.showMessageDialog(this,
"Data de Nascimento inválida!", "Erro",
JOptionPane.ERROR_MESSAGE);
return;
}
// Abrir o arquivo
try {
this.arquivo = new RandomAccessFile(new File(fileName.getName()), "rw");
} catch(FileNotFoundException exception){
JOptionPane
.showMessageDialog(
this,
"Não foi possível abrir o arquivo solicitado!",
"Erro", JOptionPane.ERROR_MESSAGE);
return;
}
// Salvar os registros no arquivo
try {
// Obter a quantidade de registros da base de dados
int quantidadeRegistros = (int) (this.arquivo.length() / ContatoRecord.size());
// Obtendo o dia, mes e ano da data de nascimento para gerar a chave
String dia = this.tfNascimento.getText().substring(0, 2);
String mes = this.tfNascimento.getText().substring(3, 5);
String ano = this.tfNascimento.getText().substring(6, 10);
// Obter a chave para calcular o hash
int chave = Integer.parseInt(dia + mes + ano);
// Obter a posicao onde o registro deverá ser salvo
int posicaoHash = chave % 23;
// Posicionar o pointer do registro no inicio do arquivo
this.arquivo.seek(0);
// Indicador de que a posicao de inserção foi encontrada
boolean procurandoPosicao = true;
// Encontrar uma posicao para a insercao do registro
for(int bloco = 0; procurandoPosicao; bloco++)
{
// Posicao a ser analisada
int posicaoAnalisada = posicaoHash + (bloco * 23);
// Verificar se a posicao analisada é suportada pelo arquivo
if(posicaoAnalisada < quantidadeRegistros)
{
// Posicionar o pointer sobre o registro Hash do bloco atual
this.arquivo.seek(posicaoAnalisada * ContatoRecord.size());
// Ler o registro corrente
String valorCorrente = this.arquivo.readUTF();
// Verificar se a posicao esta vaga
if((valorCorrente.equals("0") ||(valorCorrente.equals(tfNome.getText()))))
{
// Voltar a posicao lida
this.arquivo.seek(posicaoAnalisada * ContatoRecord.size());
// Sair do loop de procura
procurandoPosicao = false;
}
}
else
{
// Posicionar o cursor no final do arquivo
this.arquivo.seek(this.arquivo.length());
// Adicionar registro nulos até a posicao analisada
for(int count = quantidadeRegistros; count < posicaoAnalisada; count++)
{
// Escrever um registro nulo na base de dados
this.arquivo.writeInt(0);
}
// Sair do loop de procura
procurandoPosicao = false;
}
}
// Escrever o registro na posicao indicada
ContatoRecord newRecord = new ContatoRecord(this.tfNome.getText(),
this.tfEndereco.getText(), this.tfNascimento.getText(),
this.tfTelefone.getText());
// Gravar o aluno na base de dados
newRecord.write(this.arquivo);
} catch (IOException exception) {
JOptionPane.showMessageDialog(this,
"Não foi possível salvar o registro no arquivo!", "Erro",
JOptionPane.ERROR_MESSAGE);
return;
}
// Limpar o formulario e avisar o usuario de que o registro foi salvo
// com sucesso
this.tfNome.setText("");
this.tfEndereco.setText("");
this.tfNascimento.setText("");
this.tfTelefone.setText("");
JOptionPane.showMessageDialog(this, "Registro salvo com sucesso!",
"Informação", JOptionPane.INFORMATION_MESSAGE);
// Fechar o arquivo
try {
this.arquivo.close();
} catch (IOException exception) {
JOptionPane
.showMessageDialog(
this,
"Não foi possível fechar o arquivo após salvar o registro!",
"Erro", JOptionPane.ERROR_MESSAGE);
return;
}
}
/**
* Metodo responsavel pela busca dos registros na base de dados
*/
private void pesquisarRegistro() {
// Perguntar o nome do contato desejado
String resultado = JOptionPane.showInputDialog(this, "Nome",
"Pesquisar", JOptionPane.QUESTION_MESSAGE);
// Verificar se o usuario forneceu algum nome de contato
if ((resultado == null) || (resultado.equals(""))) {
return;
} else {
// Abrir o arquivo
try {
this.arquivo = new RandomAccessFile(new File(fileName.getName()), "rw");
} catch(FileNotFoundException exception){
JOptionPane
.showMessageDialog(
this,
"Não foi possível abrir o arquivo solicitado!",
"Erro", JOptionPane.ERROR_MESSAGE);
return;
}
boolean encontrou = false;
try {
// Obter a quantidade de registros da base de dados
int quantidadeRegistros = (int) (this.arquivo.length() / ContatoRecord.size());
// Obter a posicao onde o registro deverá ser lido
// Aqui eu teria que pelo nome saber qual a data de nascimento para calcular a posicao do registro
int posicaoHash = ????? % 23;
// Posicionar o pointer do registro no inicio do arquivo
this.arquivo.seek(0);
// Pesquisar em todos os blocos do arquivo
for(int bloco = 0; true; bloco++)
{
// Posicao a ser analisada
int posicaoAnalisada = posicaoHash + (bloco * 23);
// Verificar se a posicao analisada é suportada pelo arquivo
if(posicaoAnalisada < quantidadeRegistros)
{
// Posicionar o pointer sobre o registro Hash do bloco atual
this.arquivo.seek(posicaoAnalisada * ContatoRecord.size());
// Aqui eu teria que buscar os nomes e guardar em nomeCorrente para comparar com o resultado
String nomeCorrente = "";
// Verificar se o registro foi encontrado
if(nomeCorrente.equals(resultado))
{
encontrou = true;
break;
}
}
}
} catch(Exception exception){
// Fim da leitura de dados
exception.printStackTrace();
return;
}
// Limpar o formulario e avisar o usuario de que o registro foi salvo com sucesso
this.tfNome.setText("");
if(encontrou)
{
JOptionPane.showMessageDialog(this, "Registro localizado!", "Informação", JOptionPane.INFORMATION_MESSAGE);
}
else
{
JOptionPane.showMessageDialog(this, "Registro não localizado!", "Erro", JOptionPane.ERROR_MESSAGE);
}
// Fechar o arquivo
try
{
this.arquivo.close();
}
catch(IOException exception)
{
JOptionPane.showMessageDialog(this, "Não foi possível fechar o arquivo após pesquisar os registros!", "Erro", JOptionPane.ERROR_MESSAGE);
return;
}
}
}