2011-08-31 55 views

回答

40

使用Files.size(Path)得到一個文件的大小。

對於目錄(意爲其中包含的所有文件的大小)的大小,你仍然需要手動遞歸,據我所知。

+0

我認爲上面的方法不存在於Java7 I/O中,請檢查一次 – developer

+1

@Damodar:我的答案包含一個指向JavaDoc的鏈接。你爲什麼認爲它不存在? –

+1

他與Oracle的官方API文檔相關聯。方法就在那裏。 – 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()); 
      } 
} 

這將計算目錄中所有文件的大小。但是,請注意目錄中的所有文件都需要是常規文件,因爲API指定了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

想知道爲什麼'AtomicLong'是必須的?爲什麼不只是一個「長」?有什麼與[walkFileTree](http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#walkFileTree%28java.nio.file.Path,%20java。 util.Set,%20int,%20java.nio.file.FileVisitor%29)? – peterh

+0

tbh,我只是重寫了其他答案,而不使用3pp(MutableLong)。但我認爲變量必須是「最終的」才能從內部的匿名類訪問。 AtomicLong允許的。 –

+0

'postVisitDirectory'方法也可能被重寫。不需要在這裏標記'size'引用爲final,因爲它在內部的匿名類中不會改變。只有其內容(價值)發生了變化。一個長陣列(只有一個單元)可以用來代替AtomicLong。 – Stephan

相關問題