디렉토리에서 특정 확장자를 가진 파일 목록을 얻고 싶습니다. 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
클래스는 Swing 이 JFileChooser
.
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.FileFilter
에 java.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);