【问题标题】:Reading files from a directory in Scala从 Scala 中的目录读取文件
【发布时间】:2012-01-27 04:27:44
【问题描述】:

如何在 Scala 的目录中获取文件列表(或所有 *.txt 文件)。 Source 类似乎没有帮助。

【问题讨论】:

    标签: scala


    【解决方案1】:
    new java.io.File(dirName).listFiles.filter(_.getName.endsWith(".txt"))
    

    【讨论】:

      【解决方案2】:

      JDK7版本,使用新的DirectoryStream类为:

      import java.nio.file.{Files, Path}
      Files.newDirectoryStream(path)
          .filter(_.getFileName.toString.endsWith(".txt"))
          .map(_.toAbsolutePath)
      

      这不是一个字符串,而是一个路径,它上面有很多方便的方法,比如'relativize'和'subpath'。

      请注意,您还需要导入 import scala.collection.JavaConversions._ 以启用与 Java 集合的互操作。

      【讨论】:

      • 我不知道这在以前的版本中是否有效,但现在我得到错误`value map is not a member of java.nio.file.DirectoryStream[java.nio.file.Path ] `
      • 听起来你需要为 Java 集合导入隐式转换:import scala.collection.JavaConversions._ 这将像map 这样的 scala 方法添加到 Java 集合中,这对于与 java 库(如 nio)的互操作非常有用
      • 我的里程数不同。这对我有用(在 Spark shell 中):scala> import java.nio.file.{Files, Paths, Path}; scala> import scala.collection.JavaConversions._; scala> for (file <- Files.newDirectoryStream(Paths.get("/Users/Ion/Uploads/"), "*.TXT")){ ` |打印(文件);` ` | };`
      • @NickCecil 您的文本文件过滤器未按预期工作。来自endsWith 方法的文档:...for example, the path "foo/bar" ends with "foo/bar" and "bar". It does not end with "r" or "/bar".。这是因为过滤器在Path 对象上运行,而不是Strings
      【解决方案3】:

      Java File 类确实是您所需要的,尽管它很容易为目录迭代添加一些 Scala 优点。

      import scala.collection.JavaConversions._
      
      for(file <- myDirectory.listFiles if file.getName endsWith ".txt"){
         // process the file
      }
      

      【讨论】:

      • 我试图编辑两个小错字,但由于它只是两个字符,它不会让我。包的名称是collection,而您的for 中缺少右括号。
      【解决方案4】:

      目前,您应该使用 Java 库来执行此操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-22
        • 2010-10-11
        • 2016-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多