ディレクトリ内の特定の拡張子を持つファイルのリストを取得したいと思います。 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
を使用してみてください。例えば:
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");
}
});
FileNameExtensionFilter
を使用する具体的な理由はありますか?私はこれが機能することを知っています。
private File[] getNewTextFiles() {
return dir.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".txt");
}
});
}
Java 8構文の1行:
pdfTestDir.listFiles((dir, name) -> name.toLowerCase().endsWith(".txt"));
これはすぐに作成したもので、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"});
Duh .... listFilesにはJava.io.FileFilterが必要です。 FileNameExtensionFilterはjavax.swing.filechooser.FileFilterを拡張します。 Java.io.FileFilterのインスタンスを実装することで問題を解決しました
編集:@cFreinerの答えに似たものを使用しました。独自の実装を記述する代わりにJava APIメソッドを使用しようとしていたため、FileNameExtensionFilterを使用しようとしていました。私のアプリケーションには多くのFileChoosersがあり、そのためにFileNameExtensionFiltersを使用しましたが、誤ってJava.io.FileFilterを拡張していると思っていました。
Javaラムダ(Java 8以降で利用可能)を使用すると、javax.swing.filechooser.FileFilter
をJava.io.FileFilter
に1行で簡単に変換できます。
javax.swing.filechooser.FileFilter swingFilter = new FileNameExtensionFilter("jpeg files", "jpeg");
Java.io.FileFilter ioFilter = file -> swingFilter.accept(file);
new File("myDirectory").listFiles(ioFilter);