0

I need to get names of a lot of folders and files in the folders. I tried using FileUtils, but it's too slow compared to java's native Files.walk(), and I can't use it because of that reason.

But I can't even use the java's Files.walk() because when it tries to read a hidden file, it throws Exception and stops (the hidden file cannot be avoided, someone said it's a design mistake - Files.walk skip directories). Is there any different way? I don't know what to do now.

  • 3
    [`FileVisitor`](https://docs.oracle.com/javase/8/docs/api/java/nio/file/FileVisitor.html)? – Andy Turner Dec 02 '19 at 22:06
  • 1
    Does this answer your question? [Files.walk(), calculate total size](https://stackoverflow.com/questions/22867286/files-walk-calculate-total-size) It doesn't do exactly what you want it to do, but the answer from 2017 explains how to use the FileWalkTree and FileVisitor pattern to do this fast. – Nzall Dec 02 '19 at 22:09
  • Or [Catch UncheckedIOException in Java 8 stream](https://stackoverflow.com/questions/39558339/catch-uncheckedioexception-in-java-8-stream)? – Andy Thomas Dec 02 '19 at 22:11
  • I tried FileVisitor but it's still too slow. Is it just a limitation of the language? Or is there a faster way to read file names? –  Dec 03 '19 at 14:20

1 Answers1

0


Kindly do the following in your code.-

import org.apache.commons.io.filefilter.HiddenFileFilter;

I will give you an example-

package test;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;

import org.apache.commons.io.filefilter.HiddenFileFilter;

public class ListHiddenAndVisibleFilesTest {

    public static void main(String[] args) throws IOException {
        File directory = new File(".");

        System.out.println("Hidden Files:");
        File[] hiddenFiles = directory.listFiles((FileFilter) HiddenFileFilter.HIDDEN);
        for (File hiddenFile : hiddenFiles) {
            System.out.println("hidden file: " + hiddenFile.getCanonicalPath());
        }

        System.out.println("\nVisible Files:");
        File[] visibleFiles = directory.listFiles((FileFilter) HiddenFileFilter.VISIBLE);
        for (File visibleFile : visibleFiles) {
            System.out.println("visible file: " + visibleFile.getCanonicalPath());
        }
    }
}

This gives result like

Hidden Files:
hidden file: C:\kum\workspace\test\hidden1.txt
hidden file: C:\kum\workspace\test\hidden2.txt

Visible Files:
visible file: C:\kum\workspace\test\.classpath
visible file: C:\kum\workspace\test\.project
visible file: C:\kum\workspace\test\visibleFile.txt
Kum
  • 333
  • 7
  • 20