Resetar Ponteiro interno do BufferedReader

1 resposta
FrancoC

O seguinte trecho de código realiza uma iteração sobre os arquivos de um determinado diretório remoto através do protocolo FTP. Cada arquivo texto desse diretório é carregado em um InputStream, através do método retrieveFileStream() da classe FTPCliente do Apache Commons Net Api. Esse objeto InputStream é empacotado em um BufferedReader que armazena o arquivo em um buffer e permite realizar uma leitura linha-a-linha. O problema é que antes de eu ler o arquivo e armazenar seus registros em uma coleção de objetos, preciso verificar se o arquivo não foi preenchido com zeros. Quando não há dados para enviar a plataforma baixa envia esses arquivos preenchidos com zero. E ai preciso acessar o buffer e verificar seu conteúdo e isso altera o ponteiro interno de leitura do objeto BufferedReader, então quando vou lê-lo novamente para o devido parsing ele me retorna uma referencia nula.
Tentei criar um clone do BufferedReader, mas o conteúdo do buffer foi esvaziado no original. Tentei duplicar o retorno do retrieveFileStream, um para leitura do arquivo e outro para verificar se ele é zerado, sem sucesso também. Alguém tem alguma sugestão?

for (int i = 0; i < ftpArray.length; i++) {
	InputStream input = ftp.retrieveFileStream(ftpArray[i].getName());
	InputStreamReader in = new InputStreamReader(input);
	BufferedReader reader = new BufferedReader(in);
	/**
	 * Puxa os primeiros 122 bytes do arquivo, gera seu checksum por CRC-32 e o 
	 * compara com o checksum de um arquivo preenchido com zeros ([telefone removido]). 
	 * Se forem iguais, o arquivo é deletado e a iteração segue para o passo seguinte.
	 */
	char cbuf[] = new char[122];
	reader.read(cbuf, 0, 122);
	if (cbuf.length == 122) {
		checksum.reset();
		String strbuf = new String(cbuf);
		checksum.update(strbuf.getBytes(), 0, strbuf.length());
		if (checksum.getValue() == [telefone removido]) {
			if (ftp.deleteFile(ftpArray[i].getName())) {
				if (!ftp.completePendingCommand()) {
					ftp.logout();
					ftp.disconnect();
					_logger.error("Falha durante a leitura dos arquivos.");
				}
				input.close();
				reader.close();
				in.close();
				continue;
			}
		}
	}

	String linha = null;
	while ((linha = reader.readLine()) != null) {
		Objeto objeto = new Objeto();
		objeto.setPropriedade(linha.substring(6, 17));
		...
	}
}

1 Resposta

Balena

Quem sabe fechando o arquivo e os readers você consiga fazer. Não basta fechar mas sim quando for ler novamente deve ser instanciado um novo reader.

Deve funcionar.

Criado 29 de novembro de 2010
Ultima resposta 29 de nov. de 2010
Respostas 1
Participantes 2