FileNameExtensionFilter के साथ File.listFiles का उपयोग करना


83

मैं एक निर्देशिका में एक विशिष्ट विस्तार के साथ फ़ाइलों की एक सूची प्राप्त करना चाहूंगा। एपीआई (जावा 6) में, मुझे एक विधि दिखाई देती है File.listFiles(FileFilter)जो ऐसा करेगी।

चूंकि मुझे एक विशिष्ट विस्तार की आवश्यकता है, इसलिए मैंने एक बनाया FileNameExtensionFilter। हालाँकि मुझे इसके listFilesसाथ उपयोग करने पर एक संकलन त्रुटि मिलती है । मैंने यह मान लिया कि कब से FileNameExtensionFilter implements FileFilter, मुझे यह करने में सक्षम होना चाहिए। कोड इस प्रकार है:

FileNameExtensionFilter filter = new FileNameExtensionFilter("text only","txt");
String dir  = "/users/blah/dirname";
File f[] = (new File(dir)).listFiles(filter);

अंतिम पंक्ति एक संकलन त्रुटि दिखाती है:

विधि सूची प्रकार (FileNameFilter) प्रकार में फ़ाइल FileNameExtensionFilter प्रकार के तर्कों के लिए लागू नहीं होती है

मैं उपयोग करने की कोशिश कर रहा हूं listFiles(FileFilter), नहीं listFiles(FileNameFilter)। संकलक इसे क्यों नहीं पहचानता है?

यह काम करता है अगर मैं अपना खुद का एक्सटेंशन फ़िल्टर लिखता हूं FileFilter। मैं FileNameExtensionFilterअपने लिखने के बजाय उपयोग करना चाहूंगा । मैं क्या गलत कर रहा हूं?


सबसे पहले, आपको 1 तर्क के रूप में "txt" और दूसरे के रूप में "केवल पाठ" की आवश्यकता है।
लॉबस्टर 1234

कोड सही है, @ lobster1234 देखें: docs.oracle.com/javase/7/docs/api/javax/swing/filechooser/…
james.garriss

जवाबों:


183

FileNameExtensionFilterवर्ग के लिए है घुमाओ एक में इस्तेमाल किया जाएगा JFileChooser

FilenameFilterइसके बजाय प्रयोग करके देखें । उदाहरण के लिए:

File dir = new File("/users/blah/dirname");
File[] files = dir.listFiles(new FilenameFilter() {
    public boolean accept(File dir, String name) {
        return name.toLowerCase().endsWith(".txt");
    }
});

38

जावा 8 सिंटैक्स में वन-लाइनर:

pdfTestDir.listFiles((dir, name) -> name.toLowerCase().endsWith(".txt"));

7
आप घुंघराले ब्रेसिज़ को वापस कर सकते हैं और वापस लौट सकते हैं:pdfTestDir.listFiles((dir, name) -> name.toLowerCase().endsWith(".txt"));
गाबोर स्ज़ेरियस

एक अन्य समाधान:Files.list(Paths.get("your/path")).filter(path -> path.toString().endsWith(".txt")).collect(Collectors.toList());
CeePlusPlus

28

क्या कोई विशिष्ट कारण है जिसका आप उपयोग करना चाहते हैं FileNameExtensionFilter? मुझे पता है कि यह काम करता है ..

private File[] getNewTextFiles() {
    return dir.listFiles(new FilenameFilter() {
        @Override
        public boolean accept(File dir, String name) {
            return name.toLowerCase().endsWith(".txt");
        }
    });
}

1

दु .... .... सूची के लिए java.io.FileFilter की आवश्यकता होती है। FileNameExtensionFilter javax.swing.filechooser.FileFilter का विस्तार करता है। मैंने java.io.FileFilter का एक उदाहरण लागू करके मेरी समस्या का समाधान किया

संपादित करें: मैंने @ cFreiner के उत्तर के समान कुछ का उपयोग किया। मैं अपने स्वयं के कार्यान्वयन को लिखने के बजाय एक जावा एपीआई पद्धति का उपयोग करने की कोशिश कर रहा था यही कारण है कि मैं FileNameExtensionFilter का उपयोग करने की कोशिश कर रहा था। मैं अपने आवेदन में कई FileChoosers है और उसके लिए FileNameExtensionFilters का उपयोग किया है और मैंने गलती से यह मान लिया था कि यह java.io.FileFilter का विस्तार भी कर रहा है।


1

यहाँ कुछ है जो मैंने अभी अभी बनाया है और इसे File.getName () से कहीं बेहतर प्रदर्शन करना चाहिए। ("xxxx");

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

public class ExtensionsFilter implements FileFilter 
{
    private char[][] extensions;

    private ExtensionsFilter(String[] extensions)
    {
        int length = extensions.length;
        this.extensions = new char[length][];
        for (String s : extensions)
        {
            this.extensions[--length] = s.toCharArray();
        }
    }

    @Override
    public boolean accept(File file)
    {
        char[] path = file.getPath().toCharArray();
        for (char[] extension : extensions)
        {
            if (extension.length > path.length)
            {
                continue;
            }
            int pStart = path.length - 1;
            int eStart = extension.length - 1;
            boolean success = true;
            for (int i = 0; i <= eStart; i++)
            {
                if ((path[pStart - i] | 0x20) != (extension[eStart - i] | 0x20))
                {
                    success = false;
                    break;
                }
            }
            if (success)
                return true;
        }
        return false;
    }
}

यहाँ विभिन्न चित्र प्रारूपों के लिए एक उदाहरण है।

private static final ExtensionsFilter IMAGE_FILTER = 
      new ExtensionsFilter(new String[] {".png", ".jpg", ".bmp"});

10
अच्छा है, लेकिन मेरा नया मंत्र चीजों को तब तक सरल रखना है जब तक कि उन्हें जावा एपीआई विधियों / कक्षाओं का उपयोग करके अधिक जटिल होने की आवश्यकता नहीं है, जब तक कि मुझे वास्तव में अपना खुद का लिखना न हो।
अनु

@JeremyTrifilo आपने रास्ता क्यों बनाया है [pStart - i] | कोड में 0x20?
सोहिल

1
पहिया को क्यों मजबूत करें?
james.garriss

| 20 अपरकेस बनाम लोअरकेस बदलाव के लिए था। यह बल 32 अक्षर को जोड़ता है जो इसे जाँच के लिए एक निचला अक्षर बनाता है। तो आप किसी फ़ाइल को Example.PnG या Example.pNg के रूप में सहेज सकते हैं और इसे अभी भी उठा सकते हैं। मैं आम तौर पर इस तरह सामान को फिर से नहीं करता हूं, लेकिन मैं इसे करता हूं क्योंकि यह बहुत अच्छा है यदि आप समझ सकते हैं कि ये चीजें कैसे काम करती हैं और उन्हें बेहतर बनाने के लिए क्या किया जा सकता है। हालाँकि मुझे लगता है कि आपके लिए इसका मतलब यह है कि यह इस परिदृश्य के लिए बेमानी है क्योंकि प्रदर्शन में वृद्धि न्यूनतम है और इसके लिए तेज़ होने की आवश्यकता नहीं है।
जेरेमी ट्रिफ़िलो

1

जावा lambdas (जावा 8 के बाद से उपलब्ध है) के साथ आप बस में बदल सकते हैं javax.swing.filechooser.FileFilterकरने के लिए java.io.FileFilterएक पंक्ति में।

javax.swing.filechooser.FileFilter swingFilter = new FileNameExtensionFilter("jpeg files", "jpeg");
java.io.FileFilter ioFilter = file -> swingFilter.accept(file);
new File("myDirectory").listFiles(ioFilter);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.