Как создать FileFilter на Java?

#java #filefilter

#java #filefilter

Вопрос:

Как создать фильтр для файлов .txt?

Я написал что-то вроде этого, но в нем есть ошибка:

  private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {                                           
        JFileChooser chooser = new JFileChooser();
        int retval = chooser.showOpenDialog(null);
        
        String yourpath = "E:\Programy Java\Projekt_SR1\src\project_sr1";
        File directory = new File(yourpath);
        String[] myFiles;
        FilenameFilter filter = new FilenameFilter() {
        public boolean accept(File directory, String fileName) {
            return fileName.endsWith(".txt");
        }
        };
        myFiles = directory.list(filter);

        
        if(retval == JFileChooser.APPROVE_OPTION)
        {
            File myFile = chooser.getSelectedFile();
        }
  

Ответ №1:

Попробуйте что-то вроде этого…

 String yourPath = "insert here your path..";
File directory = new File(yourPath);
String[] myFiles = directory.list(new FilenameFilter() {
    public boolean accept(File directory, String fileName) {
        return fileName.endsWith(".txt");
    }
});
  

Комментарии:

1. возврат в строку! fileName.endWith(«.txt»); я получаю сообщение об ошибке endWith — не удается найти символ

2. хорошо, теперь ошибок нет, но когда я запускаю приложение, я могу выбирать все типы файлов, а не только txt : (есть идеи?

3. Проблема в том, что! символ в return !fileName.endsWith(".txt"); . Удалите ! и вы будете принимать только текстовые файлы.

4. я сделал это, и когда я запускаю приложение и щелкаю мой menuitem, он показывает JFileChooser, но я могу выбрать все типы файлов, о которых идет речь, я редактирую свой код 🙂

Ответ №2:

Здесь вы найдете несколько рабочих примеров. Это также хороший пример FileFilter, используемого в JFileChooser.

Основы заключаются в том, что вам нужно переопределить класс FileFilter и написать свой пользовательский код в его методе accpet. Метод accept в приведенном выше примере выполняет фильтрацию на основе типов файлов:

 public boolean accept(File file) {
    if (file.isDirectory()) {
      return true;
    } else {
      String path = file.getAbsolutePath().toLowerCase();
      for (int i = 0, n = extensions.length; i < n; i  ) {
        String extension = extensions[i];
        if ((path.endsWith(extension) amp;amp; (path.charAt(path.length() 
                  - extension.length() - 1)) == '.')) {
          return true;
        }
      }
    }
    return false;
}
  

Или более простым в использовании является FilenameFilter, который имеет метод accept с именем файла в качестве аргумента, поэтому вам не нужно получать его вручную.

Ответ №3:

Из JDK8 на словах это так просто, как

 final String extension = ".java";
final File currentDir = new File(YOUR_DIRECTORY_PATH);
File[] files = currentDir.listFiles((File pathname) -> pathname.getName().endsWith(extension));
  

Ответ №4:

Начиная с Java7, вы можете просто использовать FileNameExtensionFilter(String description, String... extensions)

Простой аналог JFileChooser для примера был бы:

 JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileFilter(new FileNameExtensionFilter("Text files", "txt"));
  

Я знаю, что на вопрос был дан ответ давно, но на самом деле это самое простое решение.

Ответ №5:

Вот небольшой служебный класс, который я создал:

 import java.io.File;
import java.io.FilenameFilter;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/**
 * Convenience utility to create a FilenameFilter, based on a list of extensions
 */
public class FileExtensionFilter implements FilenameFilter {
    private Set<String> exts = new HashSet<String>();

    /**
     * @param extensions
     *            a list of allowed extensions, without the dot, e.g.
     *            <code>"xml","html","rss"</code>
     */
    public FileExtensionFilter(String... extensions) {
        for (String ext : extensions) {
            exts.add("."   ext.toLowerCase().trim());
        }
    }

    public boolean accept(File dir, String name) {
        final Iterator<String> extList = exts.iterator();
        while (extList.hasNext()) {
            if (name.toLowerCase().endsWith(extList.next())) {
                return true;
            }
        }
        return false;
    }
}
  

Использование:

        String[] files = new File("myfile").list(new FileExtensionFilter("pdf", "zip"));
  

Ответ №6:

Еще один простой пример:

 public static void listFilesInDirectory(String pathString) {
  // A local class (a class defined inside a block, here a method).
  class MyFilter implements FileFilter {
    @Override
    public boolean accept(File file) {
      return !file.isHidden() amp;amp; file.getName().endsWith(".txt");
    }
  }

  File directory = new File(pathString);
  File[] files = directory.listFiles(new MyFilter());

  for (File fileLoop : files) {
    System.out.println(fileLoop.getName());
  }
}

// Call it
listFilesInDirectory("C:\Users\John\Documents\zTemp");

// Output
Cool.txt
RedditKinsey.txt
...
  

Ответ №7:

Здесь вы ошибаетесь:

 int retval = chooser.showOpenDialog(null); 
public boolean accept(File directory, String fileName) {`
return fileName.endsWith(".txt");`
}
  

Сначала вы показываете диалоговое окно выбора файла, а затем применяете фильтр! Это не сработает. Сначала примените фильтр, а затем покажите диалоговое окно:

 public boolean accept(File directory, String fileName) {
        return fileName.endsWith(".txt");
}
int retval = chooser.showOpenDialog(null);
  

Ответ №8:

 File f = null;
File[] paths;

try {

    f = new File(dir);

    // filefilter
    FilenameFilter fileNameFilter = new FilenameFilter() {

        public boolean accept(File dir, String name) {

            if (name.lastIndexOf('.') > 0) {

                int lastIndex = name.lastIndexOf('.');
                String str = name.substring(lastIndex);

                if (str.equals("."   selectlogtype)) {
                    return true;
                }
            }
            return false;
        }
    };

    paths = f.listFiles(fileNameFilter);

    for (int i = 0; i < paths.length; i  ) {
        try {

            FileWriter fileWriter = new FileWriter("C:/Users/maya02/workspace/ftp_log/filefilterlogtxt");
            PrintWriter bWriter = new PrintWriter(fileWriter);

            for (File writerpath1 : paths) {
                bWriter.println(writerpath1);
            }

            bWriter.close();
        } 
        catch (IOException e) { System.out.println("HATA!!"); }
    }
    System.out.println("path dosyaya aktarıldı!.");
} 
catch (Exception e) { }
  

Комментарии:

1. Какое значение ваш ответ добавляет к вопросу 5-летней давности? В чем разница между вашим ответом и другими ответами?

Ответ №9:

… Как насчет использования FileFilters от Apache из: org.apache.commons.io ?

точно так же, как:

  import org.apache.commons.io.filefilter.FileFileFilter;
 import org.apache.commons.io.filefilter.WildcardFileFilter;

 ...

 File dir = new File(".");

 String[] filters = { "*.txt"};
 IOFileFilter wildCardFilter = new WildcardFileFilter(filters, IOCase.INSENSITIVE);

 String[] files = dir.list( wildCardFilter );
 for ( int i = 0; i < files.length; i   ) {
     System.out.println(files[i]);
 }

  

Ответ №10:

FileFilter filtro=новое расширение filefilefilter(«Excel», «.csv»);

Комментарии:

1. Пожалуйста, объясните, как этот фрагмент кода отвечает на вопрос.

2. Объясните подробнее, пожалуйста