Files.walk(),计算总大小

2024-01-12

我正在尝试计算光盘上文件的大小。在 java-7 中,这可以使用文件.walkFileTree http://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#walkFileTree-java.nio.file.Path-java.nio.file.FileVisitor-如我的回答所示here https://stackoverflow.com/questions/7255592/get-file-directory-size-using-java-7-new-io/19869323#comment32024328_19869323.

但是,如果我想使用 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:/它会抛出以下异常

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 避免它。

但是如何使用来避免这个异常文件.walk() http://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#walk-java.nio.file.Path-java.nio.file.FileVisitOption...- API?


不,这个异常是无法避免的。

异常本身发生在延迟获取中Files.walk(),因此为什么您没有尽早看到它以及为什么没有办法规避它,请考虑以下代码:

long size = Files.walk(Paths.get("C://"))
        .peek(System.out::println)
        .mapToLong(this::count)
        .sum();

在我的系统上,这将打印在我的计算机上:

C:\
C:\$Recycle.Bin
Exception in thread "main" java.io.UncheckedIOException: java.nio.file.AccessDeniedException: C:\$Recycle.Bin\S-1-5-18

当第三个文件的(主)线程上抛出异常时,该线程上的所有进一步执行都会停止。

我相信这是一个设计失败,因为就目前情况而言Files.walk绝对无法使用,因为你永远不能保证遍历目录时不会出现错误。

需要注意的一个重要点是堆栈跟踪包括sum() and reduce()操作,这是因为路径正在被延迟加载,所以在这一点上reduce(),大部分流机制被调用(在堆栈跟踪中可见),然后它获取路径,此时UnCheckedIOException occurs.

它可以possibly如果您让每个步行操作在自己的线程上执行,则可以避免这种情况。但无论如何,这都不是您想做的事情。

另外,检查文件是否确实可访问是毫无价值的(虽然在某种程度上有用),因为你不能保证它在1ms后仍然可读。

未来的扩展

我相信它仍然可以修复,尽管我不知道如何修复FileVisitOption确实有效。
目前有一个FileVisitOption.FOLLOW_LINKS,如果它在每个文件的基础上运行,那么我会怀疑FileVisitOption.IGNORE_ON_IOEXCEPTION也可以添加,但是我们无法正确地将该功能注入其中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Files.walk(),计算总大小 的相关文章

随机推荐

  • 如何让 Pyflakes 忽略语句?

    我们的许多模块都是从以下开始的 try import json except ImportError from django utils import simplejson as json Python 2 4 fallback 这是整个文
  • 获取 Haskell CSV 中的列并推断列类型

    我正在交互式 ghci 会话中探索 csv 文件 在 jupyter 笔记本中 import Text CSV import Data List import Data Maybe dat lt parseCSVFromFile home
  • 如何从我的应用程序中打开 iPhone 日历?

    我希望能够在我的应用程序中实现一个按钮 用于退出我的应用程序 并将用户带到 iPhone 的日历 我对将用户发送到特定事件不感兴趣 只要打开日历就可以了 有什么建议么 嘿可能是一个迟到的答案 但你现在可以这样做 UIApplication
  • ExtJS 4 关联和 store.save()

    我正在使用 ExtJS 4 并且有一个定义了关联 hasMany 的模型 ModelA gt hasMany gt ModelB 我使用 GridA 显示来自 ModelA 的数据 单击 GridA 中的记录时 我使用 rowSelect
  • 使用jquery进行反应以滑动切换

    我正在尝试通过制作带有可折叠项目的菜单来学习一些 React 我使用 jQuery 来实现它的 SlideToggle 功能 但我无法让它正常工作 反应代码的相关部分是这样的 var CollapsableMenuItem React cr
  • 在react-native-web中使用flex布局复制/粘贴

    我有一个通过 React Native 和 React Native Web 在本机和 Web 上运行的应用程序 一个屏幕包含一个带有自定义项目符号的列表 如下图所示 尽管文本通常会长到多行 问题是 当您复制 粘贴 至少在网络上 时 项目符
  • jquery 承诺的延迟

    我找不到delay or wait函数为jQuery承诺 我在 SO 上找到了一项功能 使用 jQuery Deferred 避免嵌套 setTimeout 回调 https stackoverflow com q 17983331 104
  • 用户如何在客户端下载文件(Google Web Toolkit)

    我正在使用 GWT Google Web Toolkit 制作一个网站 我需要向用户显示一个表格 并让用户下载表格的内容 在客户端 用户按下 下载 按钮时如何下载文件 下载 按钮有一个onClick 听众 并且客户端类扩展Composite
  • 外部声明中的警告

    include
  • Scala 有没有通用的记忆方法?

    我想记住这一点 def fib n Int if n lt 1 1 else fib n 1 fib n 2 println fib 100 times out 所以我写了这个 令人惊讶的是 它编译并工作了 我很惊讶 因为fib在其声明中引
  • 使用 PHP shell_exec() 循环:使用 php for() 还是 bash for-do-done?

    假设我想执行命令mycommand使用 PHPshell exec 10倍 我应该做一个 bash 循环吗 shell exec for i in 1 10 do mycommand i done 或者更确切地说是一个 PHP 循环 for
  • 如何从主应用程序访问 Rails Engines 方法?

    我正在尝试使用 Spree Core 引擎中定义的 current order 方法 https github com spree spree blob master core lib spree core current order rb
  • Symfony2 Doctrine2 后坚持关联

    有没有办法在 symfony2 中接收关联字段的 Doctrine 生命周期事件 http docs doctrine project org projects doctrine orm en 2 0 x reference events
  • phpmyadmin 3.4.0 ERD 转 PDF

    我可以使用 Designer 工具在 phpmyadmin 3 4 0 中创建 ERD 但如何将其导出为 PDF 我可以看到 导入 导出 PDF 模式的坐标 按钮 但看不到它的作用 也看不到如何获取我的 ERD 的 PDF 提前致谢 你已经
  • 将 AutoIT 与 Selenium 结合使用

    感谢您回答我之前的问题 但随着一个问题的解决 显然又发现了另一个问题 与Flash游戏本身的交互现在是问题所在 我尝试研究如何在 Selenium 中做到这一点 但无法完成 我见过 FlashSelenium Sikuli 和 AutoIT
  • Go 中的 switch 和 select 有什么区别?

    有什么区别吗switch and select in Go 除了一个人接受争论而另一个人不接受这一事实之外 A select仅与通道一起使用 Example https gobyexample com select A switch与具体类
  • 用于获取前一个同级的 CSS 选择器[重复]

    这个问题在这里已经有答案了 有没有办法使用纯 CSS 3 来选择具有特定类的元素的前一个同级元素 i e html div div div div div div div div css box1 some styling box2 som
  • std::引用向量

    我有这样的问题 我有课Foo 如果有这个类的一些对象 Foo a 我需要将此对象放入两个不同的向量 std vector
  • DisplayTag 导出和链接

    我正在使用显示标签库 http www displaytag org1 2 导出时所有链接都导出为文本 如何从导出中删除链接 您可以将 display column 标记上的媒体属性设置为 html 以便仅在 JSP 上显示该列 而不在导出
  • Files.walk(),计算总大小

    我正在尝试计算光盘上文件的大小 在 java 7 中 这可以使用文件 walkFileTree http docs oracle com javase 8 docs api java nio file Files html walkFile