作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是否可以使用 Scala continuations(在 2.8 中引入)递归遍历目录?
我的目录包含数百万个文件,所以我不能 use Stream
因为我会遇到内存不足的情况。我正在尝试编写一个 Actor
dispatch让 worker actor 并行处理文件。
谁有例子吗?
最佳答案
如果您想坚持使用 Java 1.6(与 1.7 中的 FileVistor
相对),并且您有子目录而不是仅在一个目录中的所有数百万个文件,您可以
class DirectoryIterator(f: File) extends Iterator[File] {
private[this] val fs = Option(f.listFiles).getOrElse(Array[File]())
private[this] var i = -1
private[this] var recurse: DirectoryIterator = null
def hasNext = {
if (recurse != null && recurse.hasNext) true
else (i+1 < fs.length)
}
def next = {
if (recurse != null && recurse.hasNext) recurse.next
else if (i+1 >= fs.length) {
throw new java.util.NoSuchElementException("next on empty file iterator")
}
else {
i += 1;
if (fs(i).isDirectory) recurse = new DirectoryIterator(fs(i))
fs(i)
}
}
}
这要求您的文件系统没有循环。如果它确实有循环,您需要跟踪您在一组中命中的目录并避免再次递归它们。 (如果文件是从两个不同的地方链接的,那么您甚至不想两次点击这些文件,那么您必须将所有内容放入一个集合中,使用迭代器而不是只是将所有文件信息读入内存。)
关于scala - 使用 Scala 2.8 continuations 递归遍历一个 LARGE 目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9827181/
我是一名优秀的程序员,十分优秀!