我正在尝试计算我的磁盘上文件的大小。在Java-7中,可以使用Files.walkFileTree来完成,就像我在这里的回答所示。
然而,如果我想使用Java-8流来完成这个操作,它将适用于某些文件夹,但不是全部。
public static void main(String[] args) throws IOException {
long size = Files.walk(Paths.get("c:/")).mapToLong(MyMain::count).sum();
System.out.println("size=" + size);
}
static long count(Path path) {
try {
return Files.size(path);
} catch (IOException | UncheckedIOException e) {
return 0;
}
}
上面的代码对路径a:/files/
可以很好地工作,但对于c:/
,它会抛出以下异常:
以上代码适用于路径a:/files/
,但对于c:/
,它将抛出下面的异常。
Exception in thread "main" java.io.UncheckedIOException: java.nio.file.AccessDeniedException: c:\$Recycle.Bin\S-1-5-20
at java.nio.file.FileTreeIterator.fetchNextIfNeeded(Unknown Source)
at java.nio.file.FileTreeIterator.hasNext(Unknown Source)
at java.util.Iterator.forEachRemaining(Unknown Source)
at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Unknown Source)
at java.util.stream.AbstractPipeline.copyInto(Unknown Source)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown Source)
at java.util.stream.AbstractPipeline.evaluate(Unknown Source)
at java.util.stream.LongPipeline.reduce(Unknown Source)
at java.util.stream.LongPipeline.sum(Unknown Source)
at MyMain.main(MyMain.java:16)
我明白这个异常是怎么发生的,以及如何使用Files.walkFileTree API来避免它。
但是,如何使用Files.walk() API来避免此异常呢?