FileNameExtensionFilter와 함께 File.listFiles 사용


82

디렉토리에서 특정 확장자를 가진 파일 목록을 얻고 싶습니다. 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내 자신을 쓰는 것보다 차라리 사용하고 싶습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?


먼저 첫 번째 인수로 "txt"를, 두 번째 인수로 "text only"를 가져야합니다.
lobster1234 2011

코드가 정확합니다. @ lobster1234. 참조 : docs.oracle.com/javase/7/docs/api/javax/swing/filechooser/…
james.garriss

답변:



37

Java 8 구문의 한 줄 :

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

7
중괄호를 생략하고 다음을 반환 할 수 있습니다.pdfTestDir.listFiles((dir, name) -> name.toLowerCase().endsWith(".txt"));
Gabor Szarnyas 2017-08-24

다른 솔루션 :Files.list(Paths.get("your/path")).filter(path -> path.toString().endsWith(".txt")).collect(Collectors.toList());
CeePlusPlus

28

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

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가 필요합니다. FileNameExtensionFilter는 javax.swing.filechooser.FileFilter를 확장합니다. java.io.FileFilter 인스턴스를 구현하여 문제를 해결했습니다.

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


1

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

10
좋지만, 내 새로운 만트라는 더 복잡 할 필요가없는 한 간단하게 유지하는 것입니다. 즉, 실제로 직접 작성해야하는 경우가 아니면 Java API 메서드 / 클래스를 사용하는 것입니다.
Anu 2011

@JeremyTrifilo 경로를 완료 한 이유 [pStart-i] | 코드에서 0x20?
Sohil 2011

1
바퀴를 재발 명하는 이유는 무엇입니까?
james.garriss

| 20은 대문자 대 소문자 변형을위한 것입니다. 확인을 위해 소문자로 만드는 문자에 32를 강제로 추가합니다. 따라서 파일을 Example.PnG 또는 Example.pNg로 저장할 수 있으며 여전히 파일을 선택합니다. 나는 일반적으로 이와 같은 것을 다시 실행하지 않지만 이러한 작업이 어떻게 작동하는지 이해하고 더 좋게 만들기 위해 무엇을 할 수 있는지 이해할 수 있다면 훌륭한 학습이기 때문에 수행합니다. 그러나 성능 향상이 최소화되고 빠를 필요가 없기 때문에이 시나리오에 대해 중복된다는 것을 의미합니다.
Jeremy Trifilo

1

(자바 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);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.