如何使用Java 7中的新NIO获取文件或目录的大小?
如何使用Java 7中的新NIO获取文件或目录的大小?
使用Files.size(Path)
获取文件的大小。
对于目录的大小(即其中包含的所有文件的大小),据我所知,仍需要手动递归。
Path
就是一个Iterable<Path>
,所以你可以使用 for (Path child : parent) { /* 做一些事情 */ }
来遍历。 - Joachim Sauerjava.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();
}
AtomicLong
? 为什么不只使用long
? walkFileTree
是否有一些并行相关的东西? - peterhpostVisitDirectory
也可以被重写。这里不需要将size
引用标记为final,因为它在内部匿名类中没有被改变。只有它的内容(值)被改变了。可以使用一个长数组(只有一个元素)来代替AtomicLong。 - StephanMutableLong 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()