Fazer Cache de Diretorio

Pessoal Preciso fazer cache do diretorio C:\Digitais

meu while esta da seguinte forma

while (cont <= max) { String caminho = "C:\\Digitais\\" + cont + ".jpeg";

Como eu coloco esse codigo no while ?

[code]view plaincopy to clipboardprint?
List nomesArquivos;

Map<String,byte[]> cache = new HashMap<>();

for(String nome : nomesArquivos){
byte[] dados = carregaArquivoParaMemoria(nome);
cache.put(nome,dados);
}

byte [] dados = cache.get(nomeArquivo);

[/code]

Coloco antes ou depois do while ??

Se você precisa apenas listar os arquivos de um diretório, use a classe File e mapeios dessa forma:

try {

   File diretorio = new File("C:\\digitais");
   
   Map&lt;String,byte[]&gt; cache = new HashMap&lt;&gt;();    
    
   for (File arquivo : diretorio.listFiles()) {    
      String nome = arquivo.getAbsolutePath();
      byte[] dados = carregaArquivoParaMemoria(nome);
      cache.put(nome, dados);        
   }

} catch(Excepetion e) {
  // erros ao tentar ler a pasta aqui...
} 

Esse try/catch é necessário para manipular a classe File, o ideal é uma exceção do tipo IOException e uma outra de FileNotFoundException.

Agora sinceramente não sei pra que você está usando esse while

[quote=solidsnake]Se você precisa apenas listar os arquivos de um diretório, use a classe File e mapeios dessa forma:

try {

   File diretorio = new File("C:\\digitais");
   
   Map&lt;String,byte[]&gt; cache = new HashMap&lt;&gt;();    
    
   for (File arquivo : diretorio.listFiles()) {    
      String nome = arquivo.getAbsolutePath();
      byte[] dados = carregaArquivoParaMemoria(nome);
      cache.put(nome, dados);        
   }

} catch(Excepetion e) {
  // erros ao tentar ler a pasta aqui...
} 

Esse try/catch é necessário para manipular a classe File, o ideal é uma exceção do tipo IOException e uma outra de FileNotFoundException.

Agora sinceramente não sei pra que você está usando esse while[/quote]

O while é para comparar as imagens…para ver se realmente é da pessoa…

[quote=magalli][quote=solidsnake]Se você precisa apenas listar os arquivos de um diretório, use a classe File e mapeios dessa forma:

try {

   File diretorio = new File("C:\\digitais");
   
   Map&lt;String,byte[]&gt; cache = new HashMap&lt;&gt;();    
    
   for (File arquivo : diretorio.listFiles()) {    
      String nome = arquivo.getAbsolutePath();
      byte[] dados = carregaArquivoParaMemoria(nome);
      cache.put(nome, dados);        
   }

} catch(Excepetion e) {
  // erros ao tentar ler a pasta aqui...
} 

Esse try/catch é necessário para manipular a classe File, o ideal é uma exceção do tipo IOException e uma outra de FileNotFoundException.

Agora sinceramente não sei pra que você está usando esse while[/quote]

O while é para comparar as imagens…para ver se realmente é da pessoa…[/quote]

Bem nesse caso se você quer validar os arquivos baseados em cada iteração do while, creio que essa instrução que eu passei vai dentro dele correto?

Agora uma dica de performance, essas duas linhas podem ficar fora tanto do while quanto do for:

File diretorio = new File("C:\\digitais");  
     
Map&lt;String,byte[]&gt; cache = new HashMap&lt;&gt;();

A menos é claro de você precisar gerar um mapa para cada pessoa que rodar no while, daí você só desce a linha do Map<>…

[quote=solidsnake][quote=magalli][quote=solidsnake]Se você precisa apenas listar os arquivos de um diretório, use a classe File e mapeios dessa forma:

try {

   File diretorio = new File("C:\\digitais");
   
   Map&lt;String,byte[]&gt; cache = new HashMap&lt;&gt;();    
    
   for (File arquivo : diretorio.listFiles()) {    
      String nome = arquivo.getAbsolutePath();
      byte[] dados = carregaArquivoParaMemoria(nome);
      cache.put(nome, dados);        
   }

} catch(Excepetion e) {
  // erros ao tentar ler a pasta aqui...
} 

Esse try/catch é necessário para manipular a classe File, o ideal é uma exceção do tipo IOException e uma outra de FileNotFoundException.

Agora sinceramente não sei pra que você está usando esse while[/quote]

O while é para comparar as imagens…para ver se realmente é da pessoa…[/quote]

Bem nesse caso se você quer validar os arquivos baseados em cada iteração do while, creio que essa instrução que eu passei vai dentro dele correto?

Agora uma dica de performance, essas duas linhas podem ficar fora tanto do while quanto do for:

File diretorio = new File("C:\\digitais");  
     
Map&lt;String,byte[]&gt; cache = new HashMap&lt;&gt;();

A menos é claro de você precisar gerar um mapa para cada pessoa que rodar no while, daí você só desce a linha do Map<>…[/quote]

Então eu precisa mais ou menos assim, eu precisava carregar todas as imagens na cache e depois compara-las ja dentro da cache para o processo ser mais rápido, pq se eu tiver q ficar carregando toda vez para a cache, a mesma perde o sentido não perde? Eu preciso disso pq esta muito lento o processo e acredito qeu carregando todas de uma vez na cache e depois fazendo um laço na cache e não no hd, seria mais rápido. Estou correta??Como coloco todas de uma vez na cache e como faço um laço para pega-las diretamente da cache ???
obrigadinhaaaa…

[quote=magalli]
Então eu precisa mais ou menos assim, eu precisava carregar todas as imagens na cache e depois compara-las ja dentro da cache para o processo ser mais rápido, pq se eu tiver q ficar carregando toda vez para a cache, a mesma perde o sentido não perde? Eu preciso disso pq esta muito lento o processo e acredito qeu carregando todas de uma vez na cache e depois fazendo um laço na cache e não no hd, seria mais rápido. Estou correta??Como coloco todas de uma vez na cache e como faço um laço para pega-las diretamente da cache ???
obrigadinhaaaa…[/quote]

Bem o fato de ficar lento é muito relativo, pode ser um erro de lógica seu (por exemplo uma variável sendo instanciada com new dentro de um laço), processamento da máquina em que está executando, bugs na jvm que podem acabar conflitando suas classes, enfim, n variantes.

Agora de qualquer forma você precisará carregar as imagens para compará-las seja em cache ou não, ou seja, terá de ir no hd de qualquer forma, já pensou na hipótese (logicamente sem testar ainda), se realmente é viável criar um cache de imagens para compará-las, já que você irá gastar mais processamento ainda tendo que buscar no hd, copiar pro cache, bem são coisas a se pensar.

Quanto ao modo como buscar, pelo que estou vendo basicamente a estrutura você já tem. O problema fica em que momento do seu sistema irá “startá-la”, já que seu objetivo é carregá-las uma única vez?

Desculpe se não ajudei muito, mas é que nunca precisei implementar uma solução desse tipo.

[quote=solidsnake][quote=magalli]
Então eu precisa mais ou menos assim, eu precisava carregar todas as imagens na cache e depois compara-las ja dentro da cache para o processo ser mais rápido, pq se eu tiver q ficar carregando toda vez para a cache, a mesma perde o sentido não perde? Eu preciso disso pq esta muito lento o processo e acredito qeu carregando todas de uma vez na cache e depois fazendo um laço na cache e não no hd, seria mais rápido. Estou correta??Como coloco todas de uma vez na cache e como faço um laço para pega-las diretamente da cache ???
obrigadinhaaaa…[/quote]

Bem o fato de ficar lento é muito relativo, pode ser um erro de lógica seu (por exemplo uma variável sendo instanciada com new dentro de um laço), processamento da máquina em que está executando, bugs na jvm que podem acabar conflitando suas classes, enfim, n variantes.

Agora de qualquer forma você precisará carregar as imagens para compará-las seja em cache ou não, ou seja, terá de ir no hd de qualquer forma, já pensou na hipótese (logicamente sem testar ainda), se realmente é viável criar um cache de imagens para compará-las, já que você irá gastar mais processamento ainda tendo que buscar no hd, copiar pro cache, bem são coisas a se pensar.

Quanto ao modo como buscar, pelo que estou vendo basicamente a estrutura você já tem. O problema fica em que momento do seu sistema irá “startá-la”, já que seu objetivo é carregá-las uma única vez?

Desculpe se não ajudei muito, mas é que nunca precisei implementar uma solução desse tipo.[/quote]

Toda vez que a pessoa coloca a digital ele vai carrega o diretorio inteiro todas digitais para achar de quem é ai ele encontra,
ai passa outra pessoa a digital ele faz tudo isso pq tem que ir lá no C:\digitais e carregar tudo dinovo e tá demorando muito esse processamento preciso melhora isso…
tá com 150 cadastros tá demorando em torno de 5s, magina a hora que atingir umas 2000 digitais…

[quote=magalli]
Toda vez que a pessoa coloca a digital ele vai carrega o diretorio inteiro todas digitais para achar de quem é ai ele encontra,
ai passa outra pessoa a digital ele faz tudo isso pq tem que ir lá no C:\digitais e carregar tudo dinovo e tá demorando muito esse processamento preciso melhora isso…
tá com 150 cadastros tá demorando em torno de 5s, magina a hora que atingir umas 2000 digitais…[/quote]

Agora está ficando mais claro, mas a pasta é uma só pra todas as pessoas correto?

Se você já carregar isso assim que abrir o sistema, poderá deixar um objeto carregado com o Map<> das imagens naquele formato que te mostrei, isso é uma etapa.

A segunda etapa você só inicia quando a pessoa passar a digital, daí você chama esse objeto Map e verifica pelo método containsKey(nomeArquivo) que retorna um booleano se já existir no mapa, ou falso caso contrário, assim você não precisa percorrer os arquivos e comparar, etc e tal.

Mas o processo que você fez é isso mesmo, só precisa separar as coisas.

Agora pra se criar esse objeto Map que ficará vivo no sistema, precisa de um método public que o retorne para comparações posteriores:

public class Principal {
   public static Map&lt;String, Byte[]&gt; getImagensCarregadas() {
      return imagens; // este cara também tem que ser static
   }
}

Editei o post para informar que tanto o método quanto o objeto com o Map podem/precisam ser static já que será único para todo o sistema e na hora de comparar faça:

Map&lt;String, Byte[]&gt; imagens = Principal.getImagensCarregadas();
if (imagens.containsKey(nomeArquivo))
   // true
else
   // false

E melhor que esse objeto estático é um objeto no padrão Singleton, interessante pesquisar a respeito.