मुझे निर्देशिका में सभी जावा फाइलों को खोजने की ज़रूरत है

    private void search(File directory) {
        if (directory.isDirectory()) {
            File[] javaFilesLs = directory.listFiles(new FilenameFilter() {
                public boolean accept(File dir, String name) {
                  return name.toLowerCase().endsWith(".java");
//                return name.toLowerCase().endsWith(".java") || dir.isDirectory();
                }
            });
            if (directory.canRead()) {
                assert javaFilesLs != null;
                for (File temp : javaFilesLs) {
                    if (temp.isDirectory()) {
                        search(temp);
                    } else {
                        fileList.add(temp.getAbsolutePath());
                    }
                }
            }
        }
    }

जब मैं टिप्पणी की गई पंक्ति का उपयोग करता हूं तो उसे उपनिर्देशिका और सभी फाइलें न केवल ".java" फाइलें मिलती हैं।

2
Saneth Chandrasekara 26 मई 2019, 11:58

1 उत्तर

सबसे बढ़िया उत्तर

कमेंट लाइन का उपयोग करके आपको सभी पथ क्यों मिलते हैं, इसका कारण यह है कि dir.isDirectory() सभी फाइलों के लिए true लौटाएगा। FilenameFilter के दस्तावेज़ीकरण पर एक नज़र डालें . यह निर्दिष्ट करता है कि dir "वह निर्देशिका है जिसमें फ़ाइल मिली थी।"

इसलिए dir को देखने के बजाय, आपको यह जांचना होगा कि क्या name एक निर्देशिका का प्रतिनिधित्व करता है। होशियार तरीके हो सकते हैं, लेकिन इसे इस तरह किया जा सकता है:

new File(dir.toPath().toString(), name).isDirectory() // returns true for directories

इस प्रकार पूरा स्निपेट इस तरह दिखता है:

private void search(File directory) {
    if (directory.isDirectory()) {
        File[] javaFilesLs = directory.listFiles(new FilenameFilter() {
            public boolean accept(File dir, String name) {
                return name.toLowerCase().endsWith(".java") || new File(dir.toPath().toString(), name).isDirectory();
            }
        });
        if (directory.canRead()) {
            assert javaFilesLs != null;
            for (File temp : javaFilesLs) {
                if (temp.isDirectory()) {
                    search(temp);
                } else {
                    fileList.add(temp.getAbsolutePath());
                }
            }
        }
    }
}

वैकल्पिक रूप से, Java 8 Files.walk जो आपके लिए एक स्ट्रीम के रूप में रिकर्सन लागू करता है।

private void search(File directory) throws IOException {
    Files.walk(directory.toPath())
        .filter(f -> {
            return f.getFileName().toString().endsWith(".java");
        })
        .forEach(f -> fileList.add(f.toFile().getAbsolutePath()));
}
2
Jeppe 26 मई 2019, 10:11