Processamento de Arquivos

7 respostas
H

Bom dia a todos,

Tenho uma aplicação que deve processar alguns arquivos de uma determinada pasta.

Por exemplo C:\arquivo_processar só que nesta pasta existe 700 mil arquivos, que ao
todo utilizam 2,6 GB de tamanho.

Quando mando executar o comando list da classe File como o tamanho da pasta e muito

grande chega a demorar até uma hora, ou da a Exception Java Heap Space, então a minha
dúvida é, existe alguma possibilidade de eu fazer assim file.firstFile(), ele me retornar o
primeiro arquivo. e eu fazer isso até processar os 700 mil arquivos.

Qualquer ajuda será bem vinda, obrigado e até mais.

Vitor Hugo

7 Respostas

G

bom dia hugov,
1º Dependendo da sua aplicação, você pode criar uma estrutura que pegue somente o 1 arquivo do diretório e disparar um processamento em uma outra thread interrompendo o processamento da principal.
2º mude o arquivo processado de diretório caso necessite de backup do mesmo por exemplo (copie para o diretorio c:\arquivos_processados e delete de c:\arquivos_processar)
3º Ao finalizar o processamento vc reinicia o processamento da thread principal.

mas talvez esta não seja a melhor solução para o seu problema, pode ser que você tenha problemas quanto a performance dependendo de como irá rodar sua aplicação.

boa sorte.
[]´s

Rafael_Nunes

Dá uma olhada em FilenamFilter que o método list() recebe como parâmetro

Sugestão, usa o Filenamefilter e filtra por ordem alfabética:

http://java.sun.com/j2se/1.5.0/docs/api/java/io/FilenameFilter.html

H

gilsonpolito:
bom dia hugov,
1º Dependendo da sua aplicação, você pode criar uma estrutura que pegue somente o 1 arquivo do diretório e disparar um processamento em uma outra thread interrompendo o processamento da principal.
2º mude o arquivo processado de diretório caso necessite de backup do mesmo por exemplo (copie para o diretorio c:\arquivos_processados e delete de c:\arquivos_processar)
3º Ao finalizar o processamento vc reinicia o processamento da thread principal.

mas talvez esta não seja a melhor solução para o seu problema, pode ser que você tenha problemas quanto a performance dependendo de como irá rodar sua aplicação.

boa sorte.
[]´s

Isso é o que estou procurando, uma API pronta que possa desenvolver isso

pois o java não me disponibiliza isso. E construir um componente deste acredito
que não seja tão fácil.

Mesmo assim continuarei na luta, obrigado pela ajuda.

H

Rafael Nunes:
Dá uma olhada em FilenamFilter que o método list() recebe como parâmetro

Sugestão, usa o Filenamefilter e filtra por ordem alfabética:

http://java.sun.com/j2se/1.5.0/docs/api/java/io/FilenameFilter.html

Eu construi um filter que filtra pelo nome do arquivo, mas está pasta enorme não está funcionando

como deveria quando eu aponto para uma pasta pequena, roda como o esperado.

Estou começando a achar que esse tipo de funcionalidade  está disponível, se for construido em C

ou C++.

Valeu pela ajuda

ebasso

Cara sugiro você utilizar o java.nio , a performance é bem superior

Segundo um teste da revista mundo java o resultado foi o seguinte:

Arquivo (MB) | Solucao java.io (ms) | Solucao java.nio(ms)

17.651 | 1270 | 203

Veja artigo para saber como usar

http://www.guj.com.br/java.artigo.118.1.guj

E

hugov,

Fiz um exemplo pra ver se te atende pro que você precisa.
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FilenameFilter;
import java.io.IOException;

public class ListaArquivos {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		try {
			File arquivo = new File("c:\");

			// This filter only returns directories
			FilenameFilter fileNameFilter = new FilenameFilter() {
				@Override
				public boolean accept(File dir, String name) {
					return name.endsWith("txt");
				}
			};

			String[] filePath = arquivo.list(fileNameFilter);

			for (int i = 0; i < filePath.length; i++) {

				File file = new File(filePath[i]);

				if (file.isFile()) {

					FileReader stream = new FileReader(file);

					System.out.println("Arquivo: " + file.getPath());

					System.out.println("Começo do arquivo");

					BufferedReader bufferedReader = new BufferedReader(stream);

					String linha = bufferedReader.readLine();

					while (linha != null) {
						System.out.println("Linha: " + linha);
					}

					stream.close();

					System.out.println("Fim do arquivo");

				}

			}

		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

Espero ter ajudado !

abraços

H

Eduardo Cerqueira,

Muito obrigado pelo seus apontamentos, sobre como criar o FilenameFilter ,

eu já havia conseguido criar o filter. Mas o que acontece é que mesmo com o filter
a demora que ocorre para trazer resultados continua absurdo.

Em pastas com quantidades menores de arquivo está funcionando. O que pude

estar analisando e que a JVM deve ter uma quantidade de arquivos, ou tamanho que ela
ou o sistema operacional consegue gerenciar.

Por hora, como não consegui uma maneira de contornar essa situação, e fazer de uma

maneira nativa talvez seja muito trabalhoso, resolvemos contornar esta situação impedindo,
que seja colocado mais do que 1000 mil arquivos em um diretório.

Obrigado pela ajuda é até mais.
Criado 13 de fevereiro de 2008
Ultima resposta 14 de fev. de 2008
Respostas 7
Participantes 5