[java] FileNameExtensionFilter와 함께 File.listFiles 사용

디렉토리에서 특정 확장자를 가진 파일 목록을 얻고 싶습니다. API (Java 6) File.listFiles(FileFilter)에서이 작업을 수행 하는 방법 이 있습니다.

특정 확장자가 필요하기 때문에 FileNameExtensionFilter. 그러나 이것을 사용할 때 컴파일 오류가 발생 listFiles합니다. 이후 FileNameExtensionFilter implements FileFilter로이 작업을 수행 할 수 있어야한다고 생각했습니다. 코드는 다음과 같습니다.

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

마지막 줄에는 컴파일 오류가 표시됩니다.

File 유형의 listFiles (FileNameFilter) 메소드는 FileNameExtensionFilter 유형의 인수에 적용 할 수 없습니다.

나는 사용하려고 listFiles(FileFilter)하지 않습니다 listFiles(FileNameFilter). 컴파일러가 이것을 인식하지 못하는 이유는 무엇입니까?

이것은 내 자신의 확장 필터를 작성하면 작동합니다 FileFilter. 나는 FileNameExtensionFilter내 자신을 쓰는 것보다 차라리 사용하고 싶습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?



답변

FileNameExtensionFilter클래스는 SwingJFileChooser.

FilenameFilter대신 a 를 사용해보십시오 . 예를 들면 :

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");
    }
});


답변

Java 8 구문의 한 줄 :

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


답변

사용하고 싶은 특별한 이유가 FileNameExtensionFilter있습니까? 이게 효과가 있다는 걸 알아 ..

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


답변

Duh …. listFiles에는 java.io.FileFilter가 필요합니다. FileNameExtensionFilter는 javax.swing.filechooser.FileFilter를 확장합니다. java.io.FileFilter 인스턴스를 구현하여 문제를 해결했습니다.

편집 : @cFreiner의 대답과 비슷한 것을 사용했습니다. 자체 구현을 작성하는 대신 Java API 메서드를 사용하려고했기 때문에 FileNameExtensionFilter를 사용하려고했습니다. 내 응용 프로그램에 많은 FileChoosers가 있고 FileNameExtensionFilters를 사용했으며 java.io.FileFilter도 확장한다고 실수로 가정했습니다.


답변

여기 내가 방금 만든 것이 있는데 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;
    }
}

다음은 다양한 이미지 형식에 대한 예입니다.

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


답변

(자바 8부터 사용 가능) 자바 람다하면 간단하게 변환 할 수 있습니다 javax.swing.filechooser.FileFilterjava.io.FileFilter한 줄.

javax.swing.filechooser.FileFilter swingFilter = new FileNameExtensionFilter("jpeg files", "jpeg");
java.io.FileFilter ioFilter = file -> swingFilter.accept(file);
new File("myDirectory").listFiles(ioFilter);


답변