不带文件扩展名的Java文件实例

不带文件扩展名的Java文件实例,java,file,directory,Java,File,Directory,我试图在不知道文件扩展名的情况下获取文件实例。我尝试了另一种解决方案: String extension = null; String[] myFiles = dir.list(new FilenameFilter() { public boolean accept(File directory, String fileName) { if(fileName.lastIndexOf(".")==-1) return false; if((fileName.

我试图在不知道文件扩展名的情况下获取文件实例。我尝试了另一种解决方案:

String extension = null;
String[] myFiles = dir.list(new FilenameFilter() {
    public boolean accept(File directory, String fileName) {
        if(fileName.lastIndexOf(".")==-1) return false;
        if((fileName.substring(0, fileName.lastIndexOf("."))).equals(storageId))
            extension = fileName.substring(fileName.lastIndexOf("."), fileName.length());
    }
});
但是它不起作用,我不能影响扩展名变量,我该如何处理它才能获取文件的扩展名


非常感谢

您遇到了这样一个问题:匿名内部类的方法无法修改包含作用域的类中的局部变量。Java语言不允许这样做。只能引用最终的局部变量。在Java8中,它不必声明为final。它只需要在匿名类被实例化时有效地成为final

有很多方法可以解决这个问题,例如:

// #1
final String[] extension = new String[1];
String[] myFiles = dir.list(new FilenameFilter() {
    public boolean accept(File directory, String fileName) {
        ...
        extension[0] = ...
    }
});


// #2
final MyCustomStringHolder extension = ...
String[] myFiles = dir.list(new FilenameFilter() {
    public boolean accept(File directory, String fileName) {
        ...
        extension.setValue(...);
    }
});

// #3
private String extension = null;
public void method() {
    String[] myFiles = dir.list(new FilenameFilter() {
        public boolean accept(File directory, String fileName) {
            ...
            extension = ...
        }
    });
如果在accept方法中,则在第二个if中返回true。然后循环返回字符串[],以获取每个文件名的扩展名。