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

时间:2011-08-31 10:21:01

标签: nio java-7

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

3 个答案:

答案 0 :(得分:54)

使用Files.size(Path)获取文件大小。

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

答案 1 :(得分: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();
}

答案 2 :(得分: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的size方法:

“非常规文件的文件大小是特定于实现的,因此未指定。”

如果你偶然发现了不受管制的文件,你将要么不包括它的大小,要么返回一些未知的大小。您可以使用

检查文件是否正常
BasicFileAttributes.isRegularFile()