Metodo para ler arquivo

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

	}

Oie,

Eu dei uma solução meio “feia” em outro topico entao vou dar uma mais bunitinha agora! :stuck_out_tongue:

Primeiro eu te segiro melhorar o codigo criando uma classe Pessoa, que armazena as info que vc quer.
Depois vc cria uma classe HashTable que trata a colição como vc descreveu ai em cima.

Faça ambas as classes serializable. Acho que assim seu código fica melhor organizado.

Espero ter ajudado.