Is it better to use import scala.reflect.io.File or java.io.File in Scala?

file, scala

Solution

Neither, you're supposed to use `java.nio.file`, of course.

If you want to "enhance" that API with fancy operators, use extension methods. The author of that code has said as much on the mailing list. Being stuck on Java 6 is considered unfortunate.

The package you're pointing to was pulled into the `scala-reflect.jar` to support reflection, but warnings are everywhere about its unsupported status.

The `AbstractFile` abstraction is used by `Position`, which has a source file. The "file" you get from that is a `java.io.File`, but `AbstractFile` has factory methods that take the `reflect.io.Path` abstraction (with `File` and `Directory` subtypes). So all that code remains packaged together.

I have to stop and think every time `AbstractFile` and `File` cross my path (pun alert). I used to have a purple "`AbstractFile` is, like, totally different from `File`" t-shirt, but it wore out with multiple washings.

On the back it said, "`Position` has nothing to do with `io.Position`."

Here is the warning as it touches `api.Position`, where of course it is user-facing in the scaladoc; notice it says it is a "Java file":

  /** 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

To answer your first question, I think it's safe to say, Yes, it was supposed to help.

Problem

I see the scala.reflect.io.File class, is this supposed to help with file operations? Am I supposed to prefer to use this rather than java.io.File? What is the purpose of this class?

Original source