使用Java 7新IO获取文件/目录大小

cla*_*amp 43 nio java-7

如何在java 7中使用新的NIO获取文件或目录的大小?

Joa*_*uer 58

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

对于目录的大小(意味着包含在其中的所有文件的大小),你仍然需要手动递归,据我所知.

  • @Damodar:我的答案包含指向JavaDoc的链接。您为什么认为它不存在? (2认同)
  • 他链接到Oracle的官方API文档。方法就在那里。 (2认同)
  • @clamp:一个“路径” *是一个“ Iterable <Path>”,因此您只需为“(路径子代:父代){/ *做东西* /}”做一次。 (2认同)

Aks*_*ert 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();
}
Run Code Online (Sandbox Code Playgroud)


Iva*_*nic 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());
            }
}
Run Code Online (Sandbox Code Playgroud)

这将计算目录中所有文件的大小.但请注意,目录中的所有文件都需要是常规文件,因为API指定BasicFileAttributes的size方法:

"非常规文件的文件大小是特定于实现的,因此未指定."

如果你偶然发现了不受管制的文件,你将要么不包括它的大小,要么返回一些未知的大小.您可以检查文件是否是常规文件

BasicFileAttributes.isRegularFile()
Run Code Online (Sandbox Code Playgroud)