java मंगल - जावा में निर्देशिका खाली होने पर कैसे जांचें




उपाय प्रथम (8)

जेडीके 7 के साथ आप निर्देशिका खोलने के लिए Files.newDirectoryStream का उपयोग कर सकते हैं और उसके बाद इटरेटर की हैकक्स्ट () विधि का उपयोग करने के लिए यह जांचने के लिए कि इटरेटर पर कोई भी फाइल है (स्ट्रीम को बंद करना न भूलें)। यह java.io.File सूची विधियों की तुलना में विशाल निर्देशिकाओं के लिए बेहतर काम करना चाहिए या निर्देशिका दूरस्थ फ़ाइल सिस्टम पर है।

उदाहरण:

private static boolean isDirEmpty(final Path directory) throws IOException {
    try(DirectoryStream<Path> dirStream = Files.newDirectoryStream(directory)) {
        return !dirStream.iterator().hasNext();
    }
}

मैं यह जांचना चाहता हूं कि जावा में निर्देशिका खाली है या नहीं। लेकिन एक संभावना है कि उस निर्देशिका में कई फाइलें हैं, इसलिए यदि संभव हो तो मैं अपनी फ़ाइल सूची पूछे बिना इसे करना चाहूंगा।


java.io.File स्रोत कोड से ध्यान में रखते हुए, list() विधि करता है:

    public java.lang.String[] list() {
    ...
        byte[][] implList = listImpl(bs);
        if (implList == null) {
           // empty list
           return new String[0];
        }     
     ...
     }

     private synchronized static native byte[][] listImpl(byte[] path);

यह एक मूल विधि को बाइट सरणी से गुजरने के लिए कहता है ताकि फाइलें प्राप्त हो सकें। यदि कोई विधि null लौटाती है तो इसका मतलब है कि निर्देशिका खाली है।

जिसका मतलब है कि , फाइलों को सूचीबद्ध किए बिना निर्देशिका खालीपन की जांच करने के लिए उनके पास मूल विधि भी नहीं है, इसलिए निर्देशिका में खाली होने पर जांच करने के लिए जावा में कोई कार्यान्वयन नहीं होगा।

परिणाम : अगर लिस्टिंग फाइलों के बिना निर्देशिका खाली है तो जांच करें जावा में अभी तक लागू नहीं किया गया है।


if(!Files.list(Paths.get(directory)).findAny().isPresent()){
    Files.delete(Paths.get(directory));
 }

Files.list एक आलसी आबादी वाले स्ट्रीम के रूप में लौटें, यह आपके निष्पादन समय से संबंधित समस्या को हल करेगा।


यदि आप प्लेटफार्म आश्रित कोड के साथ रह सकते हैं - आप सिस्टम लाइब्रेरी लोड करके और अपने एपीआई का उपयोग करके वास्तविक देशी कोड का उपयोग करने का प्रयास कर सकते हैं।

उदाहरण के लिए विंडोज में आपके पास निर्देशिका नाम के साथ FindFirstFile() नामक Win32 API है (पीछे पीछे बैकस्लैश के बिना )। अगर यह कुछ और देता है . और .. आप जानते हैं कि निर्देशिका खाली नहीं है। यह सभी फाइलों को सूचीबद्ध नहीं करेगा, इसलिए यह file.list() से बहुत तेज है।

यूनिक्स पर समकक्ष opendir । आपके उद्देश्यों के लिए तर्क वही होगा।

निस्संदेह - मूल विधियों को कॉल करने पर उपयोगिता और प्रारंभिक लाइब्रेरी लोडिंग पर मूल्य होता है जिसे एफएस प्रश्नों पर सहेजने के समय तक अस्वीकार किया जाना चाहिए।


मुझे इस भ्रम के बारे में लंबे समय तक यह पता लगाना पड़ा कि निर्देशिका कैसे खाली है या नहीं, लेकिन उत्तर काफी सरल उपयोग है

class isFileEmpty{
public static void main(String args[]){
File d = new File(//Path of the Directory you want to check or open);
String path = d.getAbsolutePath().toString();
File dir = new File(path);
File[] files = dir.listFiles();
if(!dir.exists()){
System.out.Println("Directory is Empty");
}
else{
for(int i =0;i<files.length;i++){
System.out.Println(files[i])
           }
       }
   }
}

     Path checkIfEmpty=Paths.get("Pathtofile");
     DirectoryStream<Path> ds = Files.newDirectoryStream(checkIfEmpty);
     Iterator files = ds.iterator();
     if(!files.hasNext())
         Files.deleteIfExists(Paths.get(checkIfEmpty.toString()));

यह एक गंदे कामकाज है, लेकिन आप इसे हटाने ( delete विधि के साथ) को delete प्रयास कर सकते हैं, और यदि डिलीट ऑपरेशन विफल हो जाता है, तो निर्देशिका खाली नहीं होती है, अगर यह सफल हो जाती है, तो यह खाली है (लेकिन आपको फिर से बनाना होगा यह, और यह साफ नहीं है)। मैं एक बेहतर समाधान की तलाश जारी रखूंगा।

संपादित करें : मुझे java.nio.file.Files क्लास से walkFileTree मिला है: http://download.java.net/jdk7/docs/api/java/nio/file/Files.html#walkFileTree(java.nio.file.Path , java.nio.file.FileVisitor) समस्या यह है कि यह केवल जावा 7 है।

मैंने इस मुद्दे से संबंधित अन्य प्रश्नों के लिए एसओ खोजा है (निर्देशिका में फाइलों को सूचीबद्ध करना w / o सूची () जो एक बड़ी सरणी के लिए स्मृति आवंटित करता है) और जवाब काफी हमेशा होता है "आप तब तक नहीं कर सकते जब तक आप जेएनआई का उपयोग नहीं करते ", जो मंच दोनों निर्भर और बदसूरत है।


एक पासा रोलिंग के मामले में यह 1 से 6 (0 से 6 नहीं) के बीच यादृच्छिक संख्या होगी, इसलिए:

face = 1 + randomNumbers.nextInt(6);




java file-io