有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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中只显示非隐藏和非系统文件


共 (3) 个答案

  1. # 1 楼答案

    如果在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. # 2 楼答案

    如果您试图列出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创建窗口文件资源管理器的代码

  3. # 3 楼答案

    对隐藏文件执行以下操作:

    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());
            }
        });
    

    DosFileAttributes was introduced in Java 7.