2011-08-31 7 views
32

जावा 7 में नए एनआईओ का उपयोग करके मैं फ़ाइल या निर्देशिका का आकार कैसे प्राप्त कर सकता हूं?जावा 7 का उपयोग कर फ़ाइल/निर्देशिका आकार प्राप्त करें नया आईओ

+0

पुराने तरीके से क्या गलत है? जब तक रिकर्सिव निर्देशिका आकार के लिए समर्थन नहीं है। है? – Thilo

+0

मैंने सुना है कि यह बहुत तेज़ है। और मैं इसे आजमा देना चाहता हूं। – clamp

+0

मुझे आश्चर्य करना होगा कि यह तेजी से कैसे हो सकता है .. – Thilo

उत्तर

40

फ़ाइल का आकार प्राप्त करने के लिए Files.size(Path) का उपयोग करें।

किसी निर्देशिका के आकार के लिए (जिसका अर्थ है इसमें सभी फाइलों का आकार), आपको अभी भी मैन्युअल रूप से रिकर्स करने की आवश्यकता है, जहां तक ​​मुझे पता है।

+0

मुझे लगता है कि उपरोक्त विधि Java7 I/O में मौजूद नहीं है, कृपया – developer

+1

@Damodar जांचें: मेरे उत्तर में JavaDoc का एक लिंक है। आपको ऐसा क्यों लगता है कि यह मौजूद नहीं है? –

+1

वह ओरेकल के आधिकारिक एपीआई दस्तावेज़ों से जुड़ा हुआ है। विधि वहाँ है। – Thilo

5
MutableLong size = new MutableLong(); 
Files.walkFileTree(directoryPath, new SimpleFileVisitor<Path>() { 
      @Override 
      public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { 
       size.add(attrs.size()); 
      } 
} 

यह निर्देशिका में सभी फ़ाइलों के आकार की गणना करेगा। हालांकि, ध्यान दें कि निर्देशिका में सभी फ़ाइलों को नियमित फाइलों की आवश्यकता होती है, क्योंकि एपीआई BasicFileAttributes के आकार विधि को निर्दिष्ट करता है:

"उन फ़ाइलों का आकार जो नियमित फाइल नहीं हैं, कार्यान्वयन विशिष्ट है और इसलिए निर्दिष्ट नहीं है।"

यदि आप अनियमित फ़ाइल में ठोकरें हैं, तो आप या तो इसे आकार शामिल नहीं करेंगे, या कुछ अज्ञात आकार वापस नहीं करेंगे। आप जांच सकते हैं कि फ़ाइल

BasicFileAttributes.isRegularFile() 
+0

अच्छा जवाब, और प्राइमेटिव्स के लिए म्यूटेबल * कक्षाओं को सोचने वाले किसी भी व्यक्ति के लिए apache.commons.lang – Nicholi

6

यहां उदाहरण चलाने के लिए तैयार है जो निर्देशिकाओं को छोड़कर लॉग-एंड-लॉग भी दर्ज नहीं कर सकता है। यह राज्य जमा करने के लिए java.util.concurrent.atomic.AtomicLong का उपयोग करता है।

public static void main(String[] args) throws IOException { 
    Path path = Paths.get("c:/"); 
    long size = getSize(path); 
    System.out.println("size=" + size); 
} 

static long getSize(Path startPath) throws IOException { 
    final AtomicLong size = new AtomicLong(0); 

    Files.walkFileTree(startPath, new SimpleFileVisitor<Path>() { 
     @Override 
     public FileVisitResult visitFile(Path file, 
       BasicFileAttributes attrs) throws IOException { 
      size.addAndGet(attrs.size()); 
      return FileVisitResult.CONTINUE; 
     } 

     @Override 
     public FileVisitResult visitFileFailed(Path file, IOException exc) 
       throws IOException { 
      // Skip folders that can't be traversed 
      System.out.println("skipped: " + file + "e=" + exc); 
      return FileVisitResult.CONTINUE; 
     } 
    }); 

    return size.get(); 
} 
+0

का हिस्सा हैं आश्चर्यजनक क्यों 'परमाणु लांग' आवश्यक है? क्यों न केवल 'लंबा'? क्या [walkFileTree] (http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#walkFileTree%28java.nio.file.Path,%20java के बारे में कुछ समानांतर है। use.Set,% 20int,% 20java.nio.file.FileVisitor% 29)? – peterh

+0

tbh, मैं बस 3pp (MutableLong) का उपयोग किये बिना अन्य उत्तर को फिर से लिखता हूं। लेकिन मुझे लगता है कि परिवर्तनीय को आंतरिक अज्ञात वर्ग से "अंतिम" होना चाहिए। कौन सा परमाणु लांग की अनुमति देता है। –

+0

विधि 'postVisitDirectory'may भी overriden हो सकता है। 'आकार' संदर्भ को यहां अंतिम रूप में चिह्नित करने की आवश्यकता नहीं है क्योंकि यह आंतरिक अज्ञात वर्ग में नहीं बदला गया है। केवल इसकी सामग्री (मान) बदल दी गई है। परमाणु लांग के स्थान पर एक लंबी सरणी (एक एकल तत्व के साथ) का उपयोग किया जा सकता है। – Stephan

संबंधित मुद्दे