File f=new File("C:/");
File fList[] = f.listFiles();
当我使用它时,它会列出所有系统文件以及隐藏文件。
这会导致空指针异常,当我使用它在jTree中显示如下:
public void getList(DefaultMutableTreeNode node, File f) {
if(f.isDirectory()) {
DefaultMutableTreeNode child = new DefaultMutableTreeNode(f);
node.add(child);
File fList[] = f.listFiles();
for(int i = 0; i < fList.length; i++)
getList(child, fList[i]);
}
}
我应该怎么做,以便它不提供 NullPointerException 并在jTree中仅显示非隐藏和非系统文件?
答案 0 :(得分:13)
为隐藏文件执行此操作:
File root = new File(yourDirectory);
File[] files = root.listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
return !file.isHidden();
}
});
这不会返回隐藏文件。
对于系统文件,我认为这是一个Windows概念,因此试图独立于系统的File
接口可能不支持。您可以使用命令行命令(如果存在)。
或者使用@Reimeus的答案。
可能像
File root = new File("C:\\");
File[] files = root.listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
Path path = Paths.get(file.getAbsolutePath());
DosFileAttributes dfa;
try {
dfa = Files.readAttributes(path, DosFileAttributes.class);
} catch (IOException e) {
// bad practice
return false;
}
return (!dfa.isHidden() && !dfa.isSystem());
}
});
答案 1 :(得分:3)
如果在Windows下运行,Java 7引入了DosFileAttributes,可以过滤系统和隐藏文件。这可以与FileFilter
Path srcFile = Paths.get("myDirectory");
DosFileAttributes dfa = Files.readAttributes(srcFile, DosFileAttributes.class);
System.out.println("System File? " + dfa.isSystem());
System.out.println("Hidden File? " + dfa.isHidden());
答案 2 :(得分:0)
如果您尝试列出C:/
中的所有文件,请记住,还有其他文件既不是隐藏文件也不是系统文件,但仍然无法打开,因为它们需要特殊权限/权限。所以:
String[] files = file.list();
if (files!=null) {
for (String f : files) open(f);
}
因此,只需比较数组是否为null,并以这样的方式设计递归,即只跳过那些list()
函数的数组为null的文件。
private void nodes(DefaultMutableTreeNode top, File f) throws IOException {
if (f.isDirectory()) {
File[] listFiles = f.listFiles();
if (listFiles != null) {
DefaultMutableTreeNode b1[] = new DefaultMutableTreeNode[listFiles.length];
for (int i = 0; i < b1.length; i++) {
b1[i] = new DefaultMutableTreeNode(listFiles[i].toString());
top.add(b1[i]);
File g = new File(b1[i].toString());
nodes(b1[i], g);
}
}
}
以下是我用于使用jtree创建窗口文件资源管理器的代码。