2015-11-06 7 views
5

मेरे पास 100,000 फ़ाइलों वाली निर्देशिका है और मुझे मूल्य पढ़ने के लिए सभी को पुन: सक्रिय करने की आवश्यकता है। अभी मैं एक सरणी में सभी फाइलों को लोड करने के लिए listFiles() का उपयोग करता हूं और फिर एक-एक करके फिर से चलाता हूं। लेकिन क्या सरणी में लोड किए बिना ऐसा करने के लिए एक मेमोरी प्रभावी तरीका है?निर्देशिका में फ़ाइलों का बड़ा सेट I12ate

File[] tFiles = new File(Dir).listFiles(); 

try { 
    for (final File tFile : tFiles) { 
     //Process files one by one 
    } 
} 
+0

[एक उत्तर मैंने पहले दे दी है मदद कर सकते हैं] (http://stackoverflow.com/questions/27898652/how-to-read-multiple-text-files-in-java-for-gui-use-didnt-find-the-answer/27900034#27900034) आपको कुछ कार्यक्षमता बदलनी है लेकिन स्ट्रीम का उपयोग करना अधिक कुशल हो सकता है। प्रदर्शन के बारे में निश्चित नहीं है, यद्यपि। – easyDaMan

उत्तर

6

जावा 7 के बाद से, आप फ़ाइल विज़िटर पैटर्न का उपयोग फिर से निर्देशिका की सामग्री पर जाने के लिए कर सकते हैं।

FileVisitor इंटरफ़ेस के लिए प्रलेखन here है।

यह आपको File ऑब्जेक्ट्स की एक बड़ी सरणी बनाये बिना फ़ाइलों को फिर से चलाने की अनुमति देता है।

सरल उदाहरण बाहर मुद्रित करने के लिए अपने फ़ाइल नाम:

Path start = Paths.get(new URI("file:///my/folder/")); 

Files.walkFileTree(start, new SimpleFileVisitor<Path>() { 
    @Override 
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) 
     throws IOException 
    { 
     System.out.println(file); 
     return FileVisitResult.CONTINUE; 
    } 
    @Override 
    public FileVisitResult postVisitDirectory(Path dir, IOException e) 
     throws IOException 
    { 
     if (e == null) { 
      System.out.println(dir); 
      return FileVisitResult.CONTINUE; 
     } 
     else { 
      // directory iteration failed 
      throw e; 
     } 
    } 
}); 
+0

धन्यवाद! यह वही था जो मैं देख रहा था :) – prem89

+0

@ prem89 आपका स्वागत है! – Mena

1

आप अत्यधिक बॉयलरप्लेट कि JDK के FileVisitor के साथ आता है से बचना चाहते हैं, तो आप Guava उपयोग कर सकते हैं। Files.fileTreeTraverser() आप एक TreeTraverser<File> देता है जो आप (या यहां तक ​​कि उप-फ़ोल्डर) फ़ोल्डर में फ़ाइलें traversing के लिए उपयोग कर सकते हैं:

for (File f : Files.fileTreeTraverser() 
        .preOrderTraversal(new File("/parent/folder"))) { 
    // do something with each file 
} 
+0

यह आंतरिक रूप से 'संग्रह .unmodifiableList (Arrays.asList (फ़ाइलें)) को कॉल करता है;', यानी मुझे नहीं लगता कि यह प्रश्न से कोड के रूप में बेहतर है। – jan

+0

@jan, "बेहतर" से आपका क्या मतलब है इस पर निर्भर करता है। मुझे अमरूद के 'ट्रीट्रॉवर्सर' पसंद हैं क्योंकि यह वास्तव में शक्तिशाली अमूर्त है जो आपकी चीज को संक्षेप में और आसानी से करने के लिए संभव बनाता है, जिससे बग के लिए कम जगह छोड़ती है। हां, यह सबसे अधिक प्रदर्शन करने वाला समाधान नहीं हो सकता है, लेकिन ज्यादातर मामलों में यह शायद आवेदन की बाधा नहीं है। यह 100k फ़ाइलों के साथ ओपी के मामले में भी सच हो सकता है। मैं सबसे सरल संभव समाधान का उपयोग करता हूं और केवल सबसे आसान संभव समाधान पर्याप्त नहीं होने पर प्रदर्शन के लिए अनुकूलित करता हूं। –

+0

अन्य परिस्थितियों में मैं पूरी तरह से सहमत हूं, लेकिन एक कुशल समाधान के संबंध में इस प्रश्न में उत्तर/टिप्पणी के रूप में मैं सहमत नहीं हो सकता। और 100k के रूप में और भी फाइलें हो सकती हैं। – jan

2

जावा 8 lazily भरी हुई धारा संस्करण:

Files.list(new File("path to directory").toPath()).forEach(path -> { 
    File file = path.toFile(); 
    //process your file 
}); 
संबंधित मुद्दे