Processamento de Arquivos

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

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

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

[quote=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[/quote]

  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.

[quote=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
[/quote]

  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 só está disponível, se for construido em C

ou C++.

Valeu pela ajuda

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

hugov,

Fiz um exemplo pra ver se te atende pro que você precisa.

[code]
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();
	}

}

}[/code]

Espero ter ajudado !

abraços

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.