Problema ao filtrar arquivos dentro de um diretorio

7 respostas
MaikoID

Olá estou tentando filtrar determinados arquivos que estão presentes dentro de um diretorio mas não estou conseguindo.

Estou tentando usar este código, pois com a Classe FileNameExtensionFilter também não da certo.

final class Filtro extends javax.swing.filechooser.FileFilter {

            String[] extensoes;
            String descricao;

            public Filtro(String descricao, String extensoes) {
                this.descricao = descricao;
                this.extensoes = extensoes.split(",");
            }

            @Override
            public boolean accept(File f) {
                for (int i = 0; i < extensoes.length; i++) {
                    if (f.getName().endsWith(extensoes[i])) {
                        return true;
                    }
                }
                return false;
            }

            @Override
            public String getDescription() {
                return descricao;
            }
        }
        
        this.arquivos = abrir("dir", "Selecione o diretório de entrada.",
                JFileChooser.DIRECTORIES_ONLY).listFiles(new Filtro("BV arquivos", "TXT,txt"));

Ele não deixa eu compilar acusando um erro ao adicionar o novo objeto Filtro como parametro em listFiles, ENTRETANTO o parametro aceito por este metodo tem de ser herdado da classe FileFilter, como o que estou fazendo na classe Filtro. Realmente não sei porque ele não deixar passar o Filtro como parametro.

Alguma idéia ?

7 Respostas

T
import java.io.*;
import javax.swing.*;


class Filtro extends javax.swing.filechooser.FileFilter {
    
    String[] extensoes;  
    String descricao;  

    public Filtro(String descricao, String extensoes) {  
        this.descricao = descricao;  
        this.extensoes = extensoes.split(",");  
    }  

    @Override  
    public boolean accept(File f) {  
        for (int i = 0; i &lt; extensoes.length; i++) {  
            if (f.getName().endsWith(extensoes[i])) {  
                return true;  
            }  
        }  
        return false;  
    }  

    @Override  
    public String getDescription() {  
        return descricao;  
    }
}

class TesteFileFilter {
    public static void main(String[] args) {
        JFileChooser jfc = new JFileChooser();
        jfc.setFileFilter (new Filtro ("BV arquivos", "TXT,txt"));
        int returnVal = jfc.showOpenDialog(null);
    }
}

Uai - não é para usar listFiles, e sim setFileFilter.

MaikoID

Então, você entendeu errado, não é em um JFileChooser que eu tenho que usar o filtro e sim ao pegar todos os arquivos que comecam com txt dentro de determinado diretorio.

Digamos isto

File dir = new File("diretorio");
File[] arquivos = dir.listFiles("txt");

Entendeu? E dentro da classe File não existe um setFileFilter, mas existe o listFiles que aceita um parametro FileFilter, mas do modo que estou fazendo (criando uma classe que herda o FileFilter) ele acusa erro na compilação.

abraço.

T

File.listFiles requer um java.io.FileFilter, não um javax.swing.filechooser.FileFilter. Os nomes são iguais, o que dá origem a confusões.

MaikoID

È foi mesmo confusão, entretanto não consigo fazer a classe herdar do java.io.FileFilter (nem existe esta classe), o que é estranho porque a documentação diz que existe.

java.io
Interface FileFilter

public interface FileFilter

A filter for abstract pathnames.

Instances of this interface may be passed to the listFiles(FileFilter) method of the File class.

Since:
1.2

Ou não sei como usar interfaces padroes do java, não é só extender e implementar os metodos necessarios ?

abraço.

T

É claro que não existe uma classe FileFilter. Existe uma interface FileFilter.
http://java.sun.com/javase/6/docs/api/java/io/FileFilter.html

Vou dar um exemplo.

import java.util.*;
import java.io.*;
import javax.swing.*;


class Filtro implements java.io.FileFilter {
    
    String[] extensoes;  

    public Filtro(String extensoes) {  
        this.extensoes = extensoes.split(",");  
    }  

    @Override  
    public boolean accept(File f) {  
        for (int i = 0; i &lt; extensoes.length; i++) {  
            if (f.getName().endsWith(extensoes[i])) {  
                return true;  
            }  
        }  
        return false;  
    }  
}

class TesteFileFilter {
    public static void main(String[] args) {
        File[] filesInCurrentDirectory = new File (".").listFiles (new Filtro ("TXT,txt"));
        System.out.println (Arrays.asList (filesInCurrentDirectory));
    }
}
MaikoID

Putz é mesmo, esqueci completamente do implements, é que programo em c++ e nao existe o implements.

Vlw em.

T

MaikoID:
Putz é mesmo, esqueci completamente do implements, é que programo em c++ e nao existe o implements.

Vlw em.

De fato, em C++ existe só o “:” (que foi copiado para o C#). Um exemplo em C++ e outro em C++/CLR:

// C++ ---
class FileFilter {
};
class Filtro: public FileFilter {
};
// C++/CLR ---
public interface class FileFilter {
};
public ref class Filtro: public FileFilter {
};
Criado 16 de março de 2009
Ultima resposta 18 de mar. de 2009
Respostas 7
Participantes 2