我看到了scala.reflect.io.File类,这应该有助于文件操作吗?我应该更喜欢使用它而不是java.io.File吗?这门课的目的是什么?
答案 0 :(得分:9)
当然,你也不应该使用java.nio.file
。
如果您想使用花哨的运算符“增强”该API,请使用扩展方法。该代码的作者在邮件列表上也说了很多。被困在Java 6上被认为是不幸的。
您指向的软件包已被拉入scala-reflect.jar
以支持反映,但有关其不受支持状态的警告无处不在。
AbstractFile
抽象由Position
使用,它有一个源文件。您从中获取的“文件”是java.io.File
,但AbstractFile
具有采用reflect.io.Path
抽象(带File
和Directory
子类型)的工厂方法。所以所有代码仍然打包在一起。
每次AbstractFile
和File
越过我的路径(双关语警报)时,我必须停下来思考。我曾经有一个紫色的“AbstractFile
,就像,与File
”T恤完全不同,但是它经历了多次洗涤。
在背面它说,“Position
与io.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包,原因有两个:
以下是为文件访问提供的标准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.Codec
和scala.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注释进行详细记录。