मुझे सभी उप-निर्देशिकाओं में फ़ाइलों सहित निर्देशिका में सभी फ़ाइलों की एक सूची प्राप्त करने की आवश्यकता है। जावा के साथ निर्देशिका पुनरावृत्ति को पूरा करने का मानक तरीका क्या है?मैं जावा में किसी निर्देशिका में फ़ाइलों के माध्यम से कैसे पुन: प्रयास करूं?
उत्तर
यदि आप दी गई फ़ाइल (पथ) निर्देशिका है तो परीक्षण करने के लिए आप File#isDirectory()
का उपयोग कर सकते हैं। यदि यह true
है, तो आप इसके File#listFiles()
परिणाम के साथ फिर से उसी विधि को कॉल करें। इसे recursion कहा जाता है।
यहां एक बुनियादी किकऑफ उदाहरण है।
public static void main(String... args) {
File[] files = new File("C:/").listFiles();
showFiles(files);
}
public static void showFiles(File[] files) {
for (File file : files) {
if (file.isDirectory()) {
System.out.println("Directory: " + file.getName());
showFiles(file.listFiles()); // Calls same method again.
} else {
System.out.println("File: " + file.getName());
}
}
}
ध्यान दें कि यह StackOverflowError
के प्रति संवेदनशील है जब पेड़ JVM के ढेर धारण कर सकते हैं की तुलना में गहरी है। आप इसके बजाय एक पुनरावृत्ति दृष्टिकोण या tail-recursion का उपयोग करना चाह सकते हैं, लेकिन यह एक और विषय है;)
यह एक पेड़ है, इसलिए आपका मित्र पुनरावृत्ति है: मूल निर्देशिका से शुरू करें और बाल फ़ाइलों की एक सरणी प्राप्त करने के लिए विधि को कॉल करें। बाल सरणी के माध्यम से Iterate। यदि वर्तमान मान एक निर्देशिका है, तो इसे अपनी विधि के रिकर्सिव कॉल पर पास करें। यदि नहीं, तो उचित रूप से पत्ता फ़ाइल को संसाधित करें। बाहर अपाचे कॉमन्स में FileUtils वर्ग
चेक - विशेष रूप से iterateFiles:
दिया निर्देशिका (और वैकल्पिक उसकी उप-) में फ़ाइलों पर यात्रा की अनुमति देता है।
यह API सही मायने में नहीं स्ट्रीमिंग है (यदि आप mem उपयोग के बारे में परवाह है), यह पहली बार संग्रह उत्पन्न लागू किया जा सकता है, तो ही इस पर एक iterator देता है: वापसी listFiles (निर्देशिका, fileFilter , dirfilter) .iterator(); जावा 1.6 के लिए –
अच्छा विकल्प। –
जैसा कि बताया गया है, यह एक पुनरावर्तन समस्या है। विशेष रूप से, आप
listFiles()
को देखने के लिए जावा फ़ाइल एपीआई here में कर सकते हैं। यह निर्देशिका में सभी फ़ाइलों की एक सरणी देता है। इसका उपयोग
isDirectory()
यह देखने के लिए कि क्या आपको आगे की देखभाल करने की आवश्यकता है, एक अच्छी शुरुआत है।
लिंक टूटा हुआ ... !!! –
यह [लिंक] (https://docs.oracle.com/javase/8/docs/api/java/io/File.html) उपयोग में हो सकता है क्योंकि उत्तर में से एक टूटा हुआ है। – Donglecow
यदि आप जावा 1.7 का उपयोग कर रहे हैं, तो आप java.nio.file.Files.walkFileTree(...)
का उपयोग कर सकते हैं।
उदाहरण के लिए:
public class WalkFileTreeExample {
public static void main(String[] args) {
Path p = Paths.get("/usr");
FileVisitor<Path> fv = new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
throws IOException {
System.out.println(file);
return FileVisitResult.CONTINUE;
}
};
try {
Files.walkFileTree(p, fv);
} catch (IOException e) {
e.printStackTrace();
}
}
}
आप जावा 8 का उपयोग कर रहे हैं, तो आप java.nio.file.Files.walk(...)
साथ धारा इंटरफ़ेस का उपयोग कर सकते हैं:
public class WalkFileTreeExample {
public static void main(String[] args) {
try (Stream<Path> paths = Files.walk(Paths.get("/usr"))) {
paths.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
}
}
क्या कोई नई निर्देशिका चलने पर और फ़ंक्शन निष्पादित करने के दौरान धाराओं को चेकपॉइंट लगाने का कोई तरीका है? –
org.apache.commons.io.FileUtils
File file = new File("F:/Lines");
Collection<File> files = FileUtils.listFiles(file, null, true);
for(File file2 : files){
System.out.println(file2.getName());
}
उपयोग करता है, तो आप गलत का उपयोग करना उप निर्देशिका से फ़ाइलें नहीं चाहते हैं।
जावा 7+ के लिए, वहाँ भी है https://docs.oracle.com/javase/7/docs/api/java/nio/file/DirectoryStream.html
उदाहरण जावाडोक से लिया: के रूप में समय की सबसे जब एक फ़ाइल पेड़ चला गया है यू मई
List<Path> listSourceFiles(Path dir) throws IOException {
List<Path> result = new ArrayList<>();
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "*.{c,h,cpp,hpp,java}")) {
for (Path entry: stream) {
result.add(entry);
}
} catch (DirectoryIteratorException ex) {
// I/O error encounted during the iteration, the cause is an IOException
throw ex.getCause();
}
return result;
}
, @msandiford जवाब के साथ जोड़ने के लिए किसी फ़ंक्शन को निर्देशिका के रूप में निष्पादित करना चाहते हैं या किसी विशेष फ़ाइल का दौरा किया जाता है। यदि आप धाराओं का उपयोग करने के लिए अनिच्छुक हैं।निम्न विधियों अधिरोहित
Files.walkFileTree(Paths.get(Krawl.INDEXPATH), EnumSet.of(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE,
new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
throws IOException {
// Do someting before directory visit
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
throws IOException {
// Do something when a file is visited
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc)
throws IOException {
// Do Something after directory visit
return FileVisitResult.CONTINUE;
}
});
- 1. मैं सामान्य लिस्प में निर्देशिका के माध्यम से कैसे पुन: प्रयास करूं?
- 2. सी # मैं रजिस्ट्री के माध्यम से कैसे पुन: प्रयास करूं?
- 3. मैं किसी दिए गए निर्देशिका में फ़ाइलों पर कैसे पुन: प्रयास कर सकता हूं?
- 4. मैं टी-एसक्यूएल में एक्सएमएल फ़ील्ड के नोड्स के माध्यम से कैसे पुन: प्रयास करूं?
- 5. मैं जावा लिंक्ड हैश मानचित्र के माध्यम से कैसे पुन: प्रयास करूं?
- 6. मैं PHP में डोम तत्वों के माध्यम से कैसे पुन: प्रयास करूं?
- 7. मैं jQuery का उपयोग कर div के बाल तत्वों के माध्यम से कैसे पुन: प्रयास करूं?
- 8. मैं जावा स्ट्रिंग के यूनिकोड कोडपॉइंट्स के माध्यम से कैसे पुन: प्रयास कर सकता हूं?
- 9. मैं आरजेवा कक्षा के आईडी गुणों के माध्यम से कैसे पुन: प्रयास करूं?
- 10. मैं कक्षा के सदस्यों पर कैसे पुन: प्रयास करूं?
- 11. मैं सी # में किसी अज्ञात ऑब्जेक्ट के गुणों पर कैसे पुन: प्रयास करूं?
- 12. निर्देशिका में फ़ाइलों के माध्यम से कैसे पार करें?
- 13. मैं .gif छवि में प्रत्येक पिक्सेल के माध्यम से कैसे पुन: प्रयास कर सकता हूं?
- 14. फ़ाइलों को निर्देशिका में
- 15. मैं पर्ल में निर्देशिका में फ़ाइलों के माध्यम से कैसे लूप कर सकता हूं?
- 16. मैं एक कॉन्स्टेंट वेक्टर पर कैसे पुन: प्रयास करूं?
- 17. सी का उपयोग कर फ़ोल्डर में सभी फ़ाइलों के माध्यम से मैं कैसे लूप करूं?
- 18. मैं पर्ल में निर्देशिका से फ़ाइल को कैसे अलग करूं?
- 19. मैं JSON.NET के साथ नेस्टेड शब्दकोशों के माध्यम से कैसे पुन: प्रयास कर सकता हूं?
- 20. क्या मैं उप-फ़ोल्डरों सहित किसी फ़ोल्डर में सभी Outlook ईमेल के माध्यम से पुन: प्रयास कर सकता हूं?
- 21. आप फोर्टन में एक सरणी के माध्यम से कैसे पुन: प्रयास करते हैं?
- 22. जावा में किसी दिए गए निर्देशिका में गतिशील रूप से टेक्स्ट फ़ाइलों को कैसे जोड़ें?
- 23. किसी फ़ोल्डर में फ़ाइलों के माध्यम से लूपिंग
- 24. मैं एक MySQL परिणाम सेट के माध्यम से कैसे पुन: प्रयास कर सकता हूं?
- 25. मैं एक फॉर्म पर सभी चेकबॉक्स के माध्यम से कैसे पुन: प्रयास कर सकता हूं?
- 26. फ़ाइलों की सूची में पुन: प्रयास करने के लिए कुशल तरीका
- 27. जावा में किसी तारीख से निर्देशिका से फ़ाइलों को कैसे सॉर्ट करें?
- 28. मैं web.config के माध्यम से एक विशिष्ट आईआईएस फ़ोल्डर में निर्देशिका सूची कैसे सक्षम करूं?
- 29. मैं xcode के माध्यम से "इंस्टॉल कैसे करूं"?
- 30. PHP में पीडीओ के माध्यम से मैं एक MySQL क्वेरी के माध्यम से कैसे लूप करूं?
धन्यवाद बलस, किसी भी विचार पर कि यह सामान्य अनुमान के रूप में कितना गहरा हो सकता है? – James
आपकी जेवीएम की मेमोरी सेटिंग्स पर निर्भर करता है। लेकिन आम तौर पर कुछ हज़ार की तरह कुछ। यदि आपको लगता है कि आप कभी भी ऐसी निर्देशिका में भाग ले सकते हैं, तो रिकर्सन का उपयोग न करें। –
यह 'NullPointerException' के लिए अतिसंवेदनशील है जब फ़ाइल सिस्टम' isDirectory' और 'listFiles' पर कॉल के बीच बदलता है, जैसा कि 'System.out.println' ब्लॉक हो सकता है या आप वास्तव में वास्तव में दुर्भाग्यपूर्ण हो जाते हैं। यह जांचकर कि 'listFiles' का आउटपुट शून्य नहीं है, उस दौड़ की स्थिति को हल करेगा। –