如何在jtree中仅列出非隐藏和非隐藏系统文件

Akh*_*bey 3 java file-io swing jtree filefilter

File f=new File("C:/");
File fList[] = f.listFiles();
Run Code Online (Sandbox Code Playgroud)

当我使用它时,它列出所有系统文件以及隐藏文件.

当我使用它在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]);
     }
}
Run Code Online (Sandbox Code Playgroud)

我应该怎么做,以便它不提供NullPointerException并在jTree中只显示非隐藏和非系统文件

Sot*_*lis 15

为隐藏文件执行此操作:

File root = new File(yourDirectory);
File[] files = root.listFiles(new FileFilter() {
    @Override
    public boolean accept(File file) {
        return !file.isHidden();
    }
});
Run Code Online (Sandbox Code Playgroud)

这不会返回隐藏文件.

至于系统文件,我认为这是一个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());
        }
    });
Run Code Online (Sandbox Code Playgroud)

DosFileAttributes是在Java 7中引入的.