File.listFiles'ı FileNameExtensionFilter ile Kullanma


84

Bir dizinde belirli bir uzantıya sahip dosyaların bir listesini almak istiyorum. API'de (Java 6) File.listFiles(FileFilter)bunu yapacak bir yöntem görüyorum .

Belirli bir uzantıya ihtiyacım olduğu için, bir FileNameExtensionFilter. Ancak listFilesbununla kullandığımda bir derleme hatası alıyorum . O zamandan beri FileNameExtensionFilter implements FileFilterbunu yapabileceğimi varsaydım . Kod aşağıdaki gibidir:

FileNameExtensionFilter filter = new FileNameExtensionFilter("text only","txt");
String dir  = "/users/blah/dirname";
File f[] = (new File(dir)).listFiles(filter);

Son satır bir derleme hatasını gösterir:

yöntem listFiles (FileNameFilter), File türünde FileNameExtensionFilter türündeki bağımsız değişkenler için geçerli değildir

Kullanmaya çalışıyorum listFiles(FileFilter), değil listFiles(FileNameFilter). Derleyici bunu neden tanımıyor?

Bu, kendi uzantı filtremi genişletme yazarsam çalışır FileFilter. FileNameExtensionFilterKendi yazımı yazmaktansa kullanmayı tercih ederim. Neyi yanlış yapıyorum?


İlk olarak, 1. bağımsız değişken olarak "txt" ve ikinci olarak "yalnızca metin" olması gerekir.
ıstakoz 1234

Yanıtlar:


184

FileNameExtensionFilterSınıf için tasarlanmıştır salıncak bir kullanılmak üzere JFileChooser.

FilenameFilterBunun yerine a kullanmayı deneyin . Örneğin:

File dir = new File("/users/blah/dirname");
File[] files = dir.listFiles(new FilenameFilter() {
    public boolean accept(File dir, String name) {
        return name.toLowerCase().endsWith(".txt");
    }
});

38

Java 8 sözdiziminde tek satırlık:

pdfTestDir.listFiles((dir, name) -> name.toLowerCase().endsWith(".txt"));

7
Küme parantezlerini çıkarabilir ve geri dönebilirsiniz:pdfTestDir.listFiles((dir, name) -> name.toLowerCase().endsWith(".txt"));
Gabor Szarnyas

Başka bir çözüm:Files.list(Paths.get("your/path")).filter(path -> path.toString().endsWith(".txt")).collect(Collectors.toList());
CeePlusPlus

28

Kullanmak istemenizin belirli bir nedeni var FileNameExtensionFiltermı? Bunun işe yaradığını biliyorum ..

private File[] getNewTextFiles() {
    return dir.listFiles(new FilenameFilter() {
        @Override
        public boolean accept(File dir, String name) {
            return name.toLowerCase().endsWith(".txt");
        }
    });
}

1

Duh .... listFiles, java.io.FileFilter gerektirir. FileNameExtensionFilter, javax.swing.filechooser.FileFilter'ı genişletir. Sorunumu java.io.FileFilter örneğini uygulayarak çözdüm

Düzenleme: @ cFreiner'ın cevabına benzer bir şey kullandım. Kendi uygulamamı yazmak yerine bir Java API yöntemi kullanmaya çalışıyordum, bu yüzden FileNameExtensionFilter kullanmaya çalışıyordum. Uygulamamda birçok FileChooser var ve bunun için FileNameExtensionFilters kullandım ve yanlışlıkla java.io.FileFilter'ı da genişlettiğini varsaydım.


1

İşte kısa süre önce yaptığım bir şey ve File.getName () .endsWith (". Xxxx");

import java.io.File;
import java.io.FileFilter;

public class ExtensionsFilter implements FileFilter 
{
    private char[][] extensions;

    private ExtensionsFilter(String[] extensions)
    {
        int length = extensions.length;
        this.extensions = new char[length][];
        for (String s : extensions)
        {
            this.extensions[--length] = s.toCharArray();
        }
    }

    @Override
    public boolean accept(File file)
    {
        char[] path = file.getPath().toCharArray();
        for (char[] extension : extensions)
        {
            if (extension.length > path.length)
            {
                continue;
            }
            int pStart = path.length - 1;
            int eStart = extension.length - 1;
            boolean success = true;
            for (int i = 0; i <= eStart; i++)
            {
                if ((path[pStart - i] | 0x20) != (extension[eStart - i] | 0x20))
                {
                    success = false;
                    break;
                }
            }
            if (success)
                return true;
        }
        return false;
    }
}

İşte çeşitli görüntü formatları için bir örnek.

private static final ExtensionsFilter IMAGE_FILTER = 
      new ExtensionsFilter(new String[] {".png", ".jpg", ".bmp"});

10
Güzel, ama benim yeni mantram, daha karmaşık olmaları gerekmedikçe işleri basit tutmak, yani Java API yöntemlerini / sınıflarını gerçekten kendim yazmam gerekmedikçe kullanmak.
Anu

@JeremyTrifilo Neden yolu tamamladınız [pStart - i] | Kodda 0x20?
Sohil

1
Neden tekerleği yeniden icat etmelisiniz?
james.garriss

| 20 Büyük harf ve Küçük harf varyasyonları içindi. Mektuba 32 ekler ve bu da onu kontrol için küçük harf yapar. Böylece bir dosyayı Example.PnG veya Example.pNg olarak kaydedebilirsiniz ve yine de alır. Normalde bu tür şeyleri tekrar yapmam, ama bunu yapıyorum çünkü bu şeylerin nasıl çalıştığını ve onları daha iyi hale getirmek için neler yapılabileceğini anlayabiliyorsanız öğrenmek harika. Bununla birlikte, performans artışı minimum olduğu ve bunun hızlı olmasına gerek olmadığı için bu senaryo için gereksiz olduğunu söylediğinizi anlıyorum.
Jeremy Trifilo

1

(Java 8 sonrasında mevcuttur) java lambdas ile sadece dönüştürebilirsiniz javax.swing.filechooser.FileFilteriçin java.io.FileFiltertek satırda.

javax.swing.filechooser.FileFilter swingFilter = new FileNameExtensionFilter("jpeg files", "jpeg");
java.io.FileFilter ioFilter = file -> swingFilter.accept(file);
new File("myDirectory").listFiles(ioFilter);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.