如何将scala.io.BufferedSource转换成java.io.File?

How to convert scala.io.BufferedSource to java.io.File?

我想在 Scala 项目中使用 Apache POI 库。

如何将 scala.io.BufferedSource 类型转换为 java.io.File 类型?

  val file = Source.fromResource("resource.file") // is type scala.io.BufferedSource
  // how can I do the conversion here
  val workbook = WorkbookFactory.create(file) // requires type java.io.File

这可行,但我想避免指定文件夹路径,因为文件夹结构由 sbt 约定处理:

  val file = new File("src/main/resources/resource.file")
  val workbook = WorkbookFactory.create(file)

感谢您的宝贵时间

请注意,文件夹结构不由 sbt 处理。

发生的事情是 src/main/resources 的内容被传送到 JAR 中,并作为资源在您的类路径中可用。

如果您按照 Source.fromResource 所做的事情做一些事情,您应该能够得到您需要的东西。

这里是供参考的代码片段:

  /** Reads data from a classpath resource, using either a context classloader (default) or a passed one.
   *
   *  @param  resource     name of the resource to load from the classpath
   *  @param  classLoader  classloader to be used, or context classloader if not specified
   *  @return              the buffered source
   */
  def fromResource(resource: String, classLoader: ClassLoader = Thread.currentThread().getContextClassLoader())(implicit codec: Codec): BufferedSource =
    Option(classLoader.getResourceAsStream(resource)) match {
      case Some(in) => fromInputStream(in)
      case None     => throw new FileNotFoundException(s"resource '$resource' was not found in the classpath from the given classloader.")
    }

此代码是在 GitHub 上找到的,这是最近 HEAD 的 link:https://github.com/scala/scala/blob/8a2cf63ee5bad8c8c054f76464de0e10226516a0/src/library/scala/io/Source.scala#L174-L184

原则上,您可以使用 Java API 将资源作为流加载,并将其传递给 WorkbookFactory.create 静态方法重载,该重载采用 InputStream 作为有人在评论中提到的输入。

类似于

def maybeResourceAt(path: String): Option[InputStream] =
  Option(
    Thread.
      currentThread().
      getContextClassLoader().
      getResourceAsStream(path)
  )

val input = maybeResourceAt("resource.file").getOrElse(sys.error("oh noes"))
val workbook = WorkbookFactory.create(input)

应该完成工作。

我不确定谁负责关闭 InputStream。直觉上我会说 create 应该完全使用它,但要仔细检查图书馆的文档以确保。