如何在下面的scala代码中访问该文件的名称:
object FileMatcher {
private def filesHere = (new java.io.File("c:\\")).listFiles
def filesEnding(query: String) =
for (file <- filesHere; if file.getName.endsWith(query))
yield file.getName
def main(args: Array[String]) {
println(filesEnding(".js"))
}
}
我有一个.js文件,输出为:[Ljava.io.File; @ df8f5e
我尝试将'yield file'更改为'yield file.getName'但结果相同。
我假设println(filesEnding(“。js”))调用了'filesEnding'产生的toString方法,这是正确的吗?
答案 0 :(得分:3)
filesEnding
产生Array[String]
(当您使用yield file.getName
时Array[File]
使用yield file
)toString
数组的方法,是默认的toString
实现。这是打印的哈希码...这正是你得到的。你可能意味着println(filesEnding(".js").mkString("\t","\n\t","\n"))
应该很好地打印你的文件。
答案 1 :(得分:1)
File上还有另一种方法可以减少你的工作,名为list,列出名称而不是Files。根据您希望如何处理未找到搜索文件的条件,您可以处理抛出的异常或直接接收所需的文件名:
val jsFile = new File("C:\\").list.find(_ endsWith ".js").head
或生成一个选项,并通过以下方式避免异常:
val jsFileOpt = new File("C:\\").list.find(_ endsWith ".js").headOption
但是,如果将非目录路径传递给File构造函数,则仍然会出现异常。至
防止包装Option中的潜在空列表。如果返回了directorie的内容,则会获得Option [Array [String]],否则为None。 Find将返回Option [Option [String]],因此请使用flatMap
将此结果展平回选项[String]。
val jsFileOpt = Option(new File("C:\\").list).flatMap(_.find(_ endsWith ".js"))
要直接处理结果,忽略错误,请将上述提取代码与地图操作一起使用
Option(new File("C:\\").list).flatMap(_.find(_ endsWith ".js")) map {n =>
// whatever you want to do with the file name.
}
不改变自己的代码,只提取返回的数组中的第一个元素
filesEnding(".js").head
答案 2 :(得分:0)
在一个班轮中:
(new java.io.File("c:\\")).listFiles filter { _.getName.endsWith(query) } map { _.getName } foreach println
当然,将query
替换为您想要的任何内容,或者将该行放在带有名为query的参数的def中。