Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在scala中使用import scala.reflect.io.File或java.io.File更好吗?_File_Scala - Fatal编程技术网

在scala中使用import 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

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

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文档隐藏)
  • 这是一个实验性的库,除非你们知道自己在做什么,否则不应该使用它
以下是为文件访问提供的标准api:(伴随对象,而不是类)

nio的特点是通道和字节缓冲:读/写通过JVM隐式管理的活动后台线程进行。它用于高性能(通常是大容量)非阻塞I/O,而不是简单的I/O。它从通道中分块读入缓冲区,并要求对缓冲区进行解析和处理


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()