जवाबों:
File#isDirectory()यदि दी गई फ़ाइल (पथ) एक निर्देशिका है, तो आप परीक्षण करने के लिए उपयोग कर सकते हैं । यदि यह है true, तो आप इसके File#listFiles()परिणाम के साथ फिर से उसी विधि को कॉल करते हैं । इसे रिकर्सन कहते हैं ।
यहाँ एक बुनियादी किकऑफ उदाहरण है।
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तब संवेदनशील होता है जब पेड़ जेवीएम के ढेर से गहरा हो। आप इसके बजाय एक पुनरावृत्त दृष्टिकोण या पूंछ- पुनरावृत्ति का उपयोग करना चाह सकते हैं , लेकिन यह एक और विषय है;)
NullPointerExceptionतब होता है जब कॉल के बीच फाइल सिस्टम बदल जाता है isDirectoryऔर ब्लॉक या आप वास्तव में अशुभ listFilesहो जाते हैं, तो ऐसा होने की संभावना है System.out.println। जाँच रहा है कि उत्पादन listFilesशून्य है कि दौड़ की स्थिति का समाधान होगा।
java.nio.file.DirectoryStreamएक निर्देशिका पर पुनरावृति करने की अनुमति देता है, और एक छोटी मेमोरी फ़ुटप्रिंट लागू किया जा सकता है, लेकिन यह सुनिश्चित करने का एकमात्र तरीका होगा किसी विशेष प्लेटफ़ॉर्म पर मेमोरी उपयोग की निगरानी के लिए।
यदि आप जावा 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();
}
}
}
Apache Commons में विशेष रूप से iterateFiles में FileUtils वर्ग की जाँच करें :
दी गई निर्देशिका में फ़ाइलों पर पुनरावृत्ति की अनुमति देता है (और वैकल्पिक रूप से इसके उपनिर्देशिका)।
जावा 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;
}
यह एक पेड़ है, इसलिए पुनरावृत्ति आपका मित्र है: माता-पिता की निर्देशिका से शुरू करें और बच्चे की फ़ाइलों की एक सरणी प्राप्त करने के लिए विधि को कॉल करें। बाल सरणी के माध्यम से Iterate। यदि वर्तमान मान एक निर्देशिका है, तो इसे अपनी विधि के पुनरावर्ती कॉल में पास करें। यदि नहीं, तो पत्ती फ़ाइल को उचित रूप से संसाधित करें।
जैसा कि कहा गया है, यह एक पुनरावृत्ति समस्या है। विशेष रूप से, आप देखना चाह सकते हैं
listFiles()
यहाँ जावा फ़ाइल एपीआई में । यह एक डायरेक्टरी में सभी फाइलों की एक सरणी देता है। इसके साथ ही उपयोग करना
isDirectory()
यह देखने के लिए कि क्या आपको फिर से शुरू करने की आवश्यकता है, एक अच्छी शुरुआत है।
@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;
}
});
आप फ़ाइल ट्रैवर्सल के लिए File.list (FilenameFilter) (और वेरिएंट) का भी दुरुपयोग कर सकते हैं। लघु कोड और प्रारंभिक जावा संस्करणों में काम करता है, जैसे:
// list files in dir
new File(dir).list(new FilenameFilter() {
public boolean accept(File dir, String name) {
String file = dir.getAbsolutePath() + File.separator + name;
System.out.println(file);
return false;
}
});