java - रहव - शुक्र पर मंगल की दृष्टि




जावा में निर्देशिका खाली होने पर कैसे जांचें (6)

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


जेडीके 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();
    }
}

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

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])
           }
       }
   }
}

यह एक गंदे कामकाज है, लेकिन आप इसे हटाने ( 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 सूची () जो एक बड़ी सरणी के लिए स्मृति आवंटित करता है) और जवाब काफी हमेशा होता है "आप तब तक नहीं कर सकते जब तक आप जेएनआई का उपयोग नहीं करते ", जो मंच दोनों निर्भर और बदसूरत है।


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 लौटाती है तो इसका मतलब है कि निर्देशिका खाली है।

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

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


File parentDir =  file.getParentFile();
if(parentDir.isDirectory() && parentDir.list().length == 0) {
    LOGGER.info("Directory is empty");
} else {
    LOGGER.info("Directory is not empty");
}

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

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





file-io