web-dev-qa-db-ja.com

Java 7 new IO

Java 7の新しいNIOを使用してファイルまたはディレクトリのサイズを取得するにはどうすればよいですか?

46
clamp

Files.size(Path) を使用して、ファイルのサイズを取得します。

ディレクトリのサイズ(ディレクトリに含まれるすべてのファイルのサイズを意味します)については、私が知る限り、手動で再帰する必要があります。

56
Joachim Sauer

以下は、実行できないサンプルであり、入力できないディレクトリもスキップしてログに記録します。それは使用しています - 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();
}
6
Aksel Willgert
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()
5
Ivan Senic