जावा में, मैं एक निर्देशिका से केवल उपनिर्देशिका कैसे सूचीबद्ध करूं?
मैं java.io.File कार्यक्षमता का उपयोग करना चाहूंगा, ऐसा करने के लिए जावा में सबसे अच्छी विधि क्या है?
जावा में, मैं एक निर्देशिका से केवल उपनिर्देशिका कैसे सूचीबद्ध करूं?
मैं java.io.File कार्यक्षमता का उपयोग करना चाहूंगा, ऐसा करने के लिए जावा में सबसे अच्छी विधि क्या है?
जवाबों:
निर्देशिकाओं को सूचीबद्ध करने के लिए आप फ़ाइल वर्ग का उपयोग कर सकते हैं ।
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));
अपडेट करें
इस पोस्ट पर लेखक से टिप्पणी एक तेज़ तरीका, यहाँ महान चर्चा चाहता था: कैसे निर्देशिका की सूची को पूरी तरह से जावा में पुनः प्राप्त करने के लिए?
मूल रूप से:
एक बहुत ही सरल जावा 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();
}
});
::
इस उदाहरण में डबल कोलन कैसे काम करता है ?
@ मोहम्मद मंसूर आप लगभग वहां थे ... आप जो "दिर" तर्क का इस्तेमाल कर रहे थे, वह वास्तव में एक जिज्ञासु मार्ग है, इसलिए यह हमेशा सही रहेगा। यह देखने के लिए कि क्या बच्चा एक उपनिर्देशिका है या नहीं, आपको उस बच्चे का परीक्षण करने की आवश्यकता है।
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));
यदि आप 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();
}
ArrayList<File> directories = new ArrayList<File>(
Arrays.asList(
new File("your/path/").listFiles(File::isDirectory)
)
);
जावा 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
मैं 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()
बेहतर तरीके से फिट बैठता है।
मेरे लिए जो समाधान काम किया, वह उत्तर की सूची से गायब है। इसलिए मैं इस समाधान को यहाँ पोस्ट कर रहा हूँ:
File[]dirs = new File("/mypath/mydir/").listFiles((FileFilter)FileFilterUtils.directoryFileFilter());
यहाँ मैंने org.apache.commons.io.filefilter.FileFilterUtils
Apache commons-io-2.2.jar से उपयोग किया है। इसका प्रलेखन यहाँ उपलब्ध है: https://commons.apache.org/proper/commons-io/javadocs/api-2.2/org/apache/commons/io/filefilter/FileFilterUtils.html
एक के रूप में एक प्रारंभिक निर्देशिका को देखते हुए String
String
जो पैरामीटर के रूप में एक पथ लेती है । विधि में:listFiles
विधि का उपयोग करके वर्तमान निर्देशिका में फ़ाइलों की एक सरणी प्राप्त करेंयहाँ मेरे कोड के लिए समाधान है। मैंने पहले उत्तर से सिर्फ एक परिवर्तन किया । यह सभी फ़ोल्डर को वांछित निर्देशिका लाइन में केवल लाइन द्वारा सूचीबद्ध करेगा:
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!");
}