在scala中使用import scala.reflect.io.File或java.io.File更好吗?
我看到了scala.reflect.io.File类,这对文件操作有帮助吗?我应该更喜欢使用这个而不是java.io.File吗?这个类的目的是什么?在scala中使用import scala.reflect.io.File或java.io.File更好吗?,file,scala,File,Scala,我看到了scala.reflect.io.File类,这对文件操作有帮助吗?我应该更喜欢使用这个而不是java.io.File吗?这个类的目的是什么?java.io.File通常是您应该使用的 scala.reflect.io.File可用于文件操作。使用它的代码比使用Java的File类更适合scala。这是因为它使用了其他scala类,如scala.io.Codec和scala.Option,并利用了scala特性,如隐式参数。然而,它还没有(也可能永远不会)被视为可供一般使用 根据scal
java.io.File
通常是您应该使用的
scala.reflect.io.File
可用于文件操作。使用它的代码比使用Java的File类更适合scala。这是因为它使用了其他scala类,如scala.io.Codec
和scala.Option
,并利用了scala特性,如隐式参数。然而,它还没有(也可能永远不会)被视为可供一般使用
根据scala.reflect.io.File()的源代码:
如果您知道自己正在做什么,或者只是想进行实验(并且不关心将来事情是否会失败),那么您可能会决定使用scala.reflect.io.File。如果您确实决定使用它,那么源代码看起来很好地记录了ScalaDoc注释。当然,您应该使用
java.nio.file
如果您想用奇特的运算符“增强”该API,请使用扩展方法。该代码的作者在邮件列表中也说过同样的话。被困在Java6上被认为是不幸的
您指向的包被拉入scala reflect.jar
以支持反射,但到处都有关于其不受支持状态的警告
AbstractFile
抽象由具有源文件的Position
使用。您从中获得的“文件”是java.io.file
,但是AbstractFile
具有工厂方法,这些工厂方法采用reflect.io.Path
抽象(使用file
和目录
子类型)。因此,所有这些代码仍然打包在一起
每次AbstractFile
和File
经过我的路径时,我都必须停下来思考(双关语警报)。我曾经有一件紫色的“AbstractFile
与File
完全不同,但它经过多次洗涤就磨损了
背面写着,“Position
与io.Position
无关”
这是一个警告,因为它触及了api.Position
,当然它在scaladoc中面向用户;注意,它说它是一个“Java文件”:
要回答您的第一个问题,我认为可以肯定地说,是的,它应该会有所帮助。您不应该使用scala.reflect.io包,原因有两个:
- 它用于反射代码的内部使用(例如,对scala文档隐藏)
- 这是一个实验性的库,除非你们知道自己在做什么,否则不应该使用它
io的特点是读写器可以从文本文件和其他源读取/写入带有内部编码/解码的字符。这些提供了Scala源对象之外的一些操作——因此,如果您希望执行源对象不支持的高级操作,请直接使用这些操作。它还具有用于从数据文件、套接字和其他数据源读取/写入原始数据字节的InputStreams和OutputStreams功能。scala.reflect.io包甚至不在ScalaDoc页面中,因此我怀疑它仅用于内部使用。java.nio.file.files.write如何?但这不会关闭文件,是吗?不。谢谢你的提示,我添加了close:)如果我需要表示一个目录呢?还是移动文件?我认为
Source
只有在读取文件时才有用。是的。这就是我在上面展示的。scala.io非常简单——绝大多数使用都应该通过java类实现——而且永远不应该使用scala.reflect.io。
/**
* ''Note: This library is considered experimental \
and should not be used unless you know what you are doing.''
*/
/** 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
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()