在Scala中使用import scala.reflect.io.File或java.io.File更好吗?

时间:2013-11-22 16:10:17

标签: file scala

我看到了scala.reflect.io.File类,这应该有助于文件操作吗?我应该更喜欢使用它而不是java.io.File吗?这门课的目的是什么?

3 个答案:

答案 0 :(得分:9)

当然,你也不应该使用java.nio.file

如果您想使用花哨的运算符“增强”该API,请使用扩展方法。该代码的作者在邮件列表上也说了很多。被困在Java 6上被认为是不幸的。

您指向的软件包已被拉入scala-reflect.jar以支持反映,但有关其不受支持状态的警告无处不在。

AbstractFile抽象由Position使用,它有一个源文件。您从中获取的“文件”是java.io.File,但AbstractFile具有采用reflect.io.Path抽象(带FileDirectory子类型)的工厂方法。所以所有代码仍然打包在一起。

每次AbstractFileFile越过我的路径(双关语警报)时,我必须停下来思考。我曾经有一个紫色的“AbstractFile,就像,与File”T恤完全不同,但是它经历了多次洗涤。

在背面它说,“Positionio.Position无关。”

这是触及api.Position时的警告,当然它在scaladoc中面向用户;注意它说它是一个“Java文件”:

  /** Java file corresponding to the source file of this position.
   *
   *  The return type is `scala.reflect.io.AbstractFile`, which belongs to an experimental part of Scala reflection.
   *  It should not be used unless you know what you are doing. In subsequent releases, this API will be refined
   *  and exposed as a part of scala.reflect.api.
   *
   *  @group Common
   */
  def source: scala.reflect.internal.util.SourceFile

为了回答你的第一个问题,我认为可以肯定地说,是的,这应该是有帮助的。

答案 1 :(得分:4)

您不应该使用scala.reflect.io包,原因有两个:

  • 它旨在内部使用反射代码(例如,从scala doc隐藏)
  • 这个库被认为是实验性的,除非你知道自己在做什么,否则不应该使用它。

以下是为文件访问提供的标准API:scala.io.Source(伴随对象,而不是类)

import scala.io.Source

val source = Source.fromFile(fileNameString)("UTF-8")
// returns collection.Iterator[String]:
val lines = source.getLines()
// Now do something with lines ...
source.close()

java.nio功能Channels和ByteBuffers:读取/写入通过由JVM隐式管理的活动后台线程发生。它用于高性能(通常是高容量)非阻塞I / O,而不是简单的I / O.它以块的形式从通道读入缓冲区,并且需要对缓冲区进行解析和处理。

java.io具有读取器和写入器,用于从文本文件和其他源读取/写入具有内部编码/解码的字符。这些提供了除Scala的Source对象之外的一些操作 - 因此,如果您希望执行Source不支持的高级操作,请直接使用这些操作。它还具有InputStreams和OutputStreams,用于从数据文件,套接字和其他数据源读取/写入原始数据字节。

答案 2 :(得分:2)

java.io.File是您应该使用的一般内容。

scala.reflect.io.File可用于文件操作。与使用Java的File类相比,使用它来代替scala的代码。这是因为它使用其他scala类,例如scala.io.Codecscala.Option,并使用scala功能,例如隐式参数。但是,它不是(也可能永远不会)被认为可以用于一般用途。

根据scala.reflect.io.File(github)的来源:

/**
* ''Note: This library is considered experimental \
     and should not be used unless you know what you are doing.''
*/

如果您知道自己在做什么或者只是想进行实验(并且不关心将来哪些事情不起作用或中断),那么您可以决定使用scala.reflect.io.File。如果您决定使用它,源代码可以通过ScalaDoc注释进行详细记录。