Files.write 在 Scala REPL (2.10.5) 中使用字符串列表作为参数失败

Files.write with list of Strings as argument fails in Scala REPL (2.10.5)

正在处理一些示例代码,以在 scala REPL 中使用 java.nio 创建输出并将输出写入文件。适当导入后:

> import java.nio.file.Files
> import java.nio.charset.Charset
> import java.nio.charset.StandardCharsets
> import java.nio.file.Paths

我可以成功执行:

> val utf8:Charset = StandardCharsets.UTF_8
> Files.write(Paths.get("foo.txt"), "foo".getBytes(utf8))

...并创建一个包含 "foo" 的简单文件。但是,更符合我想做的事情(遍历列表并将每个元素写成一行):

> val lines:List[String] = List("line1","line2")
> Files.write(Paths.get("bar.txt"), lines, utf8)

失败,出现以下异常:

<console>:17: error: overloaded method value write with alternatives:
  (x: java.nio.file.Path,x: Iterable[_ <: CharSequence],x: java.nio.charset.Charset,x: <repeated...>[java.nio.file.OpenOption])java.nio.file.Path <and>
  (x: java.nio.file.Path,x: Array[Byte],x: <repeated...>[java.nio.file.OpenOption])java.nio.file.Path
 cannot be applied to (java.nio.file.Path, List[String], java.nio.charset.Charset)
          Files.write(Paths.get("bar.txt"), lines, utf8)

尝试使用其他 StandardOpenOptions 进行相同操作同样会失败。

谁能帮我理解为什么使用 String 的列表写操作失败?

谢谢。

所以这里的问题是Scala本身不能引入OpenOption接口。这个库在这里 https://github.com/scala-incubator/scala-io 那么你的方法调用就是这个。

Files.write(Paths.get("bar.txt"), lines.getBytes(), utf8, StandardOpenOption.WRITE)

您尝试匹配的 Files.write 的签名需要一个 java.lang.Iterable 作为参数,而 Scala List 不实现此接口。所以你有两个选择:

通过平面映射原始列表,使用接受字节数组作为参数的签名:

Files.write(Paths.get("bar.txt"), lines.flatMap(s => (s + Properties.lineSeparator).getBytes(utf8)).toArray)

或将 Scala 列表转换为 Java 列表:

import scala.collection.JavaConverters._

...

Files.write(Paths.get("bar.txt"), lines.asJava, utf8)