Filtrar extensoes de arquivos com File e FilenameUtils(função: wildcardMatchOnSystem)-JAVA

Estou fazendo um programa de busca de diretórios e filtro de arquivos por suas extensões. Preciso usar a classe File para buscar o diretório (isso consegui fazer), porém, agora preciso que ele faça uma varredura nos diretórios em busca dos arquivos com a exntensão que o usuario informar. Se tiver certo, então ele me traz a lista de arquivos. Para filtrar/buscar a extensão nos arquivos usei FilenameUtils e sua função wildcardMatchOnSystem, e condições de Verdadeiro e/ou falso. Porém traz esse erro quando digito a extensão que quero buscar:

Diretório que será analisado:

/home/juliana

Extensoes de arquivos:pdf

java.util.InputMismatchException
	at java.util.Scanner.throwFor(Scanner.java:864)
	at java.util.Scanner.next(Scanner.java:1485)
	at java.util.Scanner.next(Scanner.java:1418)
	at controle.BuscaRecursiva2.pesquisaDiretorios(BuscaRecursiva2.java:25)
	at controle.BuscaRecursiva2.main(BuscaRecursiva2.java:124)
package controle;
import java.io.*;
import java.util.Locale;
import java.util.Scanner;
import org.apache.commons.io.FilenameUtils;
//import java.util.InputMismatchException;

public class BuscaRecursiva2 {
	private int nivel = 0;
	
	void pesquisaDiretorios() {
		try {
			@SuppressWarnings("resource")
			Scanner teclado=new Scanner(System.in);
			teclado.useLocale(Locale.US);
			//variaveis com caminhos a serem pesquisados
			System.out.println("Diretório que será analisado: " );
			String caminhoDiretorio=teclado.nextLine();
			
			System.out.print("\n Extensoes de arquivos:");
			String mascara=teclado.next("%d%d"+"*txt;*pdf;*txt;*doc;*xls;*java;*mp4;*jpg;*rar;*sh");
			String mascaras[]= mascara.split(";");
			
			System.out.println("\n Extensoes nao desejadas:");
			String negoMascara=teclado.next("%d%d"+"txt*; pdf*; mp3*; doc*; xls*; java*; mp4*; jpg*; rar*; sh*");
			String nego[]= negoMascara.split(";");
			
			System.out.println("Limite do nivel de busca: " );
			nivel = teclado.nextInt();
			
			File diretorio = new File(caminhoDiretorio);
			
			//verifica a existencia do diretorio
			if(!diretorio.exists()) {
				throw new Exception("Não existe!");
			}
			
			pesquisaMascara(diretorio.getPath(), mascaras,nego);
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}
	
	public void pesquisaMascara(String diretorio, String[] mascaras, String [] nego) throws Exception {
		if(nivel >= 0) {
			File fDir = new File(diretorio);
			
			if (fDir.isDirectory()) {
				File[] listaFiles = fDir.listFiles();
				
				for (File file : listaFiles ) {
					String[] extensao = file.list();
					Boolean showMascaras = false;
					
					while(showMascaras != null) {
						for (int i = 0; i > mascaras.length; i++) {
							String masc = mascaras[i];
							
							if((extensao=masc(mascaras[i])) != null){
								Boolean showNego=false;
								
								for(int l=0;l<nego.length;l++) {
									if((extensao=negos(nego[l]))!=null) {
										showNego = true;
										break;
									}
								}
								
								if(showNego=false) {
									showMascaras=true;
									break;
								}
							}
						}
					}
					
					System.out.println("[ANALISANDO] " + file);
					
					if (file.isDirectory()) {
						if(nivel > 0) {
							nivel--;
							// se e diretorio, entra no diretorio
							pesquisaMascara(file.getPath(), mascaras,nego);
						} else {
							continue;
						}
					} else {
						if (FilenameUtils.wildcardMatchOnSystem(file.getName(), mascaras, nego)) {
							System.out.println("Encontrei o arquivo:" + file.getAbsolutePath());
						}
					}
				}
			}
		}
	}	     
	
	public String[] negos(String nego) {
		// TODO Auto-generated method stub
		return null;
	}
	
	public String[] masc(String mascaras) {
		// TODO Auto-generated method stub
		return null;
	}
	
	public static void main(String[] args) {
		new BuscaRecursiva2().pesquisaDiretorios();
	}
}

O que estaria errado ou mal estruturado no meu código??? POR FAVOR AJUDEM-ME! Tem semana que não encontro a resaposta…
OBRIGADA, DESDE JÁ!

Veja um exemplo de como fazer a busca recursivamente:

package test.main;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class Main {
	
	public static void main(String[] args) {
		File root = new File("C:/diretorioQualquer");
		List<File> files = search(root, "png", "rar");
		
		for(File f : files) {
			System.out.println(f.getName());
		}
	}
	
	private static List<File> search(File root, String ... extensions) {
		List<File> resultado = new ArrayList<>();
		
		for(File f : root.listFiles()) {
			if(f.isDirectory()) {
				resultado.addAll(search(f, extensions));
			} else {
				if(chechExtension(f, extensions)) { // verifica a extensão do arquivo
					resultado.add(f);
				}
			}
		}
		
		return resultado;
	}
	
	private static boolean chechExtension(File file, String ... extensions) {
		for(String extension : extensions) {
			if(file.getName().endsWith(extension)) {
				return true;
			}
		}
		
		return false;
	}
}
1 curtida

Certo… Mas não seria possivel receber as possiveis extensões com a função split separando cada uma.

Você precisa filtrar por mais de uma extensão é? Editei o exemplo que fiz.

é isso mesmo.

O exemplo que fiz ajudou?

Mas o que quer dizer String ... extensions esses 3 pontos dão a entender que é para completar com as possiveis extenções ou java entende que pode ser qualquer coisas recebida?

Mais ou menos… vou testar aqui, adaptando algumas coisas no meu código… Se eu conseguir respondo… Obrigada pela dica até aqui.

A parte String ... extensions chama-se varargs. É um recurso do java para enviar vários argumentos de uma vez, ou seja, um array. Nesse caso, trata-se de um array de Strings. Isso facilita pois permite que eu envie quantas extensões quiser sem precisar ficar declarando no método (String ext1, String ext2, String ext3, etc.). Entendeu?

1 curtida

AAh claro! Bemm prático mesmo… Vou tentar usar. Mas diante desse seu código haveira maneira deu optar por uma extensão sem fazer a pesquisa por todos da lista?
Como se fosse, uma case. Tipo ele recebe todas essas extensões que posso querer pesquisar mas na hora da pesquisa optar só por um tipo…

Então, no exemplo, a pesquisa é feita quando o método search é invocado:

search(root, "png", "rar");

Nesse momento, você escolhe quais extensões serão pesquisadas, ex:

search(root, "png"); // retorna apenas PNG
search(root, "png", "rar"); // retorna PNG e RAR

E se você quiser manter uma lista de extensões e usar apenas a que quiser, pode também:

String[] extensions = new String[] {"png", "rar"};
search(root, extensions[0]); // PNG
search(root, extensions[1]); // RAR
1 curtida