所以我有以下代码:
File txtFileDir = new File(MAIN_DIR + "test");
FilenameFilter filter = new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".txt");
}
};
File[] txtFiles = txtFileDir.listFiles(filter);
它在使用装有Java 1.6的Windows的开发计算机上也能正常工作。但是,当我将类移植到unix框时,它将在其上运行并尝试运行它,在FilenameFilter行上得到ClassNotFoundException。 Unix框上也有Java 1.6,所以我不知道可能是什么问题。这不是什么大问题,因为有多种方法可以完成同一件事,但是我很好奇是否有人对为什么它不能在unix盒上工作有任何想法。
我也尝试过在unix框上编译代码,以查看是否有任何区别,但是没有。该代码在Unix框中可以正常编译,但是我仍然收到相同的错误。有人有什么想法吗?
更新
我发现了问题。显然,当我编译包含该类的代码时,它创建了一个附加的.class文件,其文件名为我的类,并在其后附加了$ 1。所以我有Test.class和Test $ 1.class。保留Test $ 1.class文件后,一切正常。我猜因为我创建的内部类而需要第二类文件?至少我认为这是一个内部阶级。
无论如何,感谢大家的帮助。
最佳答案
如评论中所述,您应该首先确认您使用的是与另一台计算机相同的版本。
检查FilenameFilter是否在路径中的另一种方法是:javap java.io.FilenameFilter
因此,如果上面的命令将FilenameFilter的类名和方法列出为
Compiled from "FilenameFilter.java"
public interface java.io.FilenameFilter{
public abstract boolean accept(java.io.File, java.lang.String);
}
则FilenameFilter在您的路径中,并且无需担心版本。
但是,如果它给您带来错误,那么最简单的方法是复制包含几乎所有(绝对必要)类文件的
rt.jar
并将其替换为您现有的rt.jar
,该现有文件可能位于/usr/include/jvm/....
中,或者您可以find
它(不要忘记进行备份,也可以通过提取并通过FilenameFilter.class
来检查rt.jar
中是否存在java/io/
)