nio Rufen Sie die Datei-/Verzeichnisgröße mithilfe von Java 7 new IO ab




java nio file (3)

Hier ist ein betriebsbereites Beispiel, das auch Verzeichnisse überspringt, in die es nicht eintreten kann. Es verwendet java.util.concurrent.atomic.AtomicLong , um den Status zu akkumulieren.

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();
}

Wie kann ich mit dem neuen NIO in Java 7 die Größe einer Datei oder eines Verzeichnisses ermitteln?


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

Dies würde die Größe aller Dateien in einem Verzeichnis berechnen. Beachten Sie jedoch, dass alle Dateien im Verzeichnis reguläre Dateien sein müssen, da die API die Größenmethode von BasicFileAttributes angibt:

Msgstr "Die Größe von Dateien, die keine regulären Dateien sind, ist implementierungsspezifisch und daher nicht spezifiziert."

Wenn Sie zu einer nicht regulierten Datei stolpern, müssen Sie entweder deren Größe nicht angeben oder eine unbekannte Größe zurückgeben. Sie können überprüfen, ob die Datei regelmäßig ist

BasicFileAttributes.isRegularFile()

Answer #2

Verwenden Sie Files.size(Path) , um die Größe einer Datei zu ermitteln.

Für die Größe eines Verzeichnisses (dh die Größe aller darin enthaltenen Dateien) müssen Sie, soweit ich weiß, immer noch manuell rekursieren.