जावा, सूची से केवल उपनिर्देशिकाएँ, फाइलें नहीं


100

जावा में, मैं एक निर्देशिका से केवल उपनिर्देशिका कैसे सूचीबद्ध करूं?

मैं java.io.File कार्यक्षमता का उपयोग करना चाहूंगा, ऐसा करने के लिए जावा में सबसे अच्छी विधि क्या है?

जवाबों:


141

निर्देशिकाओं को सूचीबद्ध करने के लिए आप फ़ाइल वर्ग का उपयोग कर सकते हैं ।

File file = new File("/path/to/directory");
String[] directories = file.list(new FilenameFilter() {
  @Override
  public boolean accept(File current, String name) {
    return new File(current, name).isDirectory();
  }
});
System.out.println(Arrays.toString(directories));

अपडेट करें

इस पोस्ट पर लेखक से टिप्पणी एक तेज़ तरीका, यहाँ महान चर्चा चाहता था: कैसे निर्देशिका की सूची को पूरी तरह से जावा में पुनः प्राप्त करने के लिए?

मूल रूप से:

  1. यदि आप फ़ाइल संरचना को नियंत्रित करते हैं, तो मैं उस स्थिति में आने से बचने की कोशिश करूंगा।
  2. Java NIO.2 में, आप अधिक स्केलिंग के लिए अनुमति देने के लिए पुनरावृत्‍ति वापस करने के लिए निर्देशिका फ़ंक्शन का उपयोग कर सकते हैं। निर्देशिका स्ट्रीम क्लास एक ऐसी वस्तु है जिसका उपयोग आप किसी निर्देशिका में प्रविष्टियों पर पुनरावृति करने के लिए कर सकते हैं।

नमस्ते, उत्तर के लिए धन्यवाद। लेकिन मुझे एक निर्देशिका में सभी वस्तुओं पर पुनरावृति नहीं करनी है। मुझे निर्देशिका से सीधे उपनिर्देशिका को सूचीबद्ध करना होगा। B'coz मेरे पास बहुत सारी फाइलें हैं और एक निर्देशिका में केवल कुछ ही उपनिर्देशिका हैं, इसलिए isDirectory () की जाँच में समय लगता है। कृपया मुझे दूसरा तरीका बताएं।
लोकेश पौनिकर

मैंने अपनी पोस्ट को अपडेट किया, विशेष रूप से, इस सवाल पर जॉन स्कीट की टिप्पणी पर एक नज़र डालें। और जावा एनआईओ 2 के बाद से एनआईओ की प्रतिक्रिया में निर्देशिका फ़ंक्शन के लिए एक पुनरावृत्ति है जो निर्देशिकाओं की एक धारा लौटाता है।
मोहम्मद मंसूर

आप किस स्कीट कमेंट का जिक्र कर रहे हैं? यहां बेहतर प्रदर्शन करने वाला उत्तर क्या है?
चुपके रब्बी

107

एक बहुत ही सरल जावा 8 समाधान:

File[] directories = new File("/your/path/").listFiles(File::isDirectory);

यह FileFilter (पुराने जावा के साथ काम करता है) का उपयोग करने के बराबर है:

File[] directories = new File("/your/path/").listFiles(new FileFilter() {
    @Override
    public boolean accept(File file) {
        return file.isDirectory();
    }
});

4
::इस उदाहरण में डबल कोलन कैसे काम करता है ?
snickers10m

मैंने देखा कि कोई अन्य उत्तर फ़ाइलफ़िल्टर का उपयोग नहीं करता है, इसलिए मैंने विधि संदर्भों का उपयोग किए बिना बराबर संस्करण जोड़ा। विधि संदर्भों के बारे में अधिक जानने के लिए, इस SO प्रश्न या इस लेख का संदर्भ लें ।
हेडस्कॉक

क्या यह उपनिर्देशिका या सीधे निर्देशिकाओं को / आपके / पथ / के तहत प्राप्त करता है?
amadain

@amadain अपेक्षित पुनरावृत्ति के रूप में डॉक्स .oracle.com
javase/

14

@ मोहम्मद मंसूर आप लगभग वहां थे ... आप जो "दिर" तर्क का इस्तेमाल कर रहे थे, वह वास्तव में एक जिज्ञासु मार्ग है, इसलिए यह हमेशा सही रहेगा। यह देखने के लिए कि क्या बच्चा एक उपनिर्देशिका है या नहीं, आपको उस बच्चे का परीक्षण करने की आवश्यकता है।

File file = new File("/path/to/directory");
String[] directories = file.list(new FilenameFilter() {
  @Override
  public boolean accept(File current, String name) {
    return new File(current, name).isDirectory();
  }
});
System.out.println(Arrays.toString(directories));

7

यदि आप Java 7 और NIO.2 के उपयोग से किसी समाधान में रुचि रखते हैं, तो यह इस प्रकार हो सकता है:

private static class DirectoriesFilter implements Filter<Path> {
    @Override
    public boolean accept(Path entry) throws IOException {
        return Files.isDirectory(entry);
    }
}

try (DirectoryStream<Path> ds = Files.newDirectoryStream(FileSystems.getDefault().getPath(root), new DirectoriesFilter())) {
        for (Path p : ds) {
            System.out.println(p.getFileName());
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

3
ArrayList<File> directories = new ArrayList<File>(
    Arrays.asList(
        new File("your/path/").listFiles(File::isDirectory)
    )
);

नमस्ते, और StackOverflow में आपका स्वागत है! क्या आप अपने उत्तर के बारे में थोड़ा विस्तार से बता सकते हैं? अपने कोड स्निपेट्स के दिलचस्प हिस्सों की व्याख्या करना या फ़्यूचर रीडिंग के लिए दस्तावेज़ से लिंक करना?
रिचर्ड-डिगनेन

यह सही उत्तर होना चाहिए क्योंकि यह संपूर्ण कैननिकल पथ के साथ एक फ़ाइल ऑब्जेक्ट प्रदान करता है। यह पुराना हो सकता है लेकिन यह इस ओर इशारा करने लायक है
जीरो डुंगोग

2

जावा 7 और एनआईओ में रुचि रखने वालों के लिए, ऊपर @ वू के उत्तर का एक वैकल्पिक समाधान है । हम कोशिश करने वाले संसाधनों का उपयोग कर सकते हैं जो कॉल Files.find()और एक लैम्ब्डा फ़ंक्शन का उपयोग करते हैं जो निर्देशिकाओं को फ़िल्टर करने के लिए उपयोग किया जाता है।

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;


final Path directory = Paths.get("/path/to/folder");

try (Stream<Path> paths = Files.find(directory, Integer.MAX_VALUE, (path, attributes) -> attributes.isDirectory())) {
    paths.forEach(System.out::println);
} catch (IOException e) {
    ...
}

हम लैम्बडा फ़ंक्शन को बदलकर निर्देशिकाओं को नाम से फ़िल्टर भी कर सकते हैं:

(path, attributes) -> attributes.isDirectory() && path.toString().contains("test")

या दिनांक से:

final long now = System.currentTimeMillis();
final long yesterday = new Date(now - 24 * 60 * 60 * 1000L).getTime();

// modified in the last 24 hours
(path, attributes) -> attributes.isDirectory() && attributes.lastModifiedTime().toMillis() > yesterday

2

मैं java.io.File कार्यक्षमता का उपयोग करना चाहूंगा,

2012 में (सवाल की तारीख) हां, आज नहीं। java.nioएपीआई को ऐसी आवश्यकताओं के लिए इष्ट होना चाहिए।

इतने सारे जवाबों के साथ भयानक, लेकिन इतना आसान तरीका नहीं है कि मैं इसका उपयोग करूं Files.walk().filter().collect()

विश्व स्तर पर दो दृष्टिकोण संभव हैं:

1) जबकि Files.walk(Path start, )कोई maxDepthसीमा नहीं है

2) Files.walk(Path start, int maxDepth, FileVisitOption... options)इसे सेट करने की अनुमति देता है।

किसी भी गहराई सीमा को निर्दिष्ट किए बिना, यह देगा:

Path directory = Paths.get("/foo/bar");

try {
    List<Path> directories =
            Files.walk(directory)
                 .filter(Files::isDirectory)
                 .collect(Collectors.toList());
} catch (IOException e) {
    // process exception
}

और अगर विरासत के कारणों के लिए, आपको एक सूची प्राप्त करने की आवश्यकता है, तो आप संग्रह से पहले Fileएक map(Path::toFile)ऑपरेशन जोड़ सकते हैं:

Path directory = Paths.get("/foo/bar");

try {
    List<File> directories =
            Files.walk(directory)
                 .filter(Files::isDirectory)
                 .map(Path::toFile)
                 .collect(Collectors.toList());
} catch (IOException e) {
    // process exception
}

वहाँ भी है Files.list(Path)जो शायद के रूप में ही है Files.walk(Path,1)
डेविड एल।

@ डेविड एल वास्तव Files.list(Path)में एक उचित विकल्प है अगर हम पुनरावर्ती फ़ोल्डर पुनरावृति नहीं करना चाहते हैं। फ़ोल्डरों को पुनरावृत्ति करने के लिए, walk()बेहतर तरीके से फिट बैठता है।
davidxxx

1

मेरे लिए जो समाधान काम किया, वह उत्तर की सूची से गायब है। इसलिए मैं इस समाधान को यहाँ पोस्ट कर रहा हूँ:

File[]dirs = new File("/mypath/mydir/").listFiles((FileFilter)FileFilterUtils.directoryFileFilter());

यहाँ मैंने org.apache.commons.io.filefilter.FileFilterUtilsApache commons-io-2.2.jar से उपयोग किया है। इसका प्रलेखन यहाँ उपलब्ध है: https://commons.apache.org/proper/commons-io/javadocs/api-2.2/org/apache/commons/io/filefilter/FileFilterUtils.html


0

एक के रूप में एक प्रारंभिक निर्देशिका को देखते हुए String

  1. एक विधि बनाएं Stringजो पैरामीटर के रूप में एक पथ लेती है । विधि में:
  2. प्रारंभिक निर्देशिका के आधार पर एक नई फ़ाइल ऑब्जेक्ट बनाएं
  3. listFilesविधि का उपयोग करके वर्तमान निर्देशिका में फ़ाइलों की एक सरणी प्राप्त करें
  4. फ़ाइलों की सरणी पर लूप करें
    1. यदि यह एक फाइल है, तो लूपिंग जारी रखें
    2. यदि यह एक निर्देशिका है, तो नाम का प्रिंट आउट लें और इस नई निर्देशिका पथ पर फिर से लिखें

नमस्ते, उत्तर के लिए धन्यवाद। लेकिन मुझे एक निर्देशिका में सभी वस्तुओं पर पुनरावृति नहीं करनी है। मुझे निर्देशिका से सीधे उपनिर्देशिका को सूचीबद्ध करना होगा। B'coz मेरे पास बहुत सारी फाइलें हैं और एक निर्देशिका में केवल कुछ ही उपनिर्देशिका हैं, इसलिए isDirectory () की जाँच में समय लगता है। कृपया मुझे दूसरा तरीका बताएं।
लोकेश पौनिकर

0

यहाँ मेरे कोड के लिए समाधान है। मैंने पहले उत्तर से सिर्फ एक परिवर्तन किया । यह सभी फ़ोल्डर को वांछित निर्देशिका लाइन में केवल लाइन द्वारा सूचीबद्ध करेगा:

try {
            File file = new File("D:\\admir\\MyBookLibrary");
            String[] directories = file.list(new FilenameFilter() {
              @Override
              public boolean accept(File current, String name) {
                return new File(current, name).isDirectory();
              }
            });
            for(int i = 0;i < directories.length;i++) {
                if(directories[i] != null) {
                    System.out.println(Arrays.asList(directories[i]));

                }
            }
        }catch(Exception e) {
            System.err.println("Error!");
        }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.