如何将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
应该完全使用它,但要仔细检查图书馆的文档以确保。
我想在 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
应该完全使用它,但要仔细检查图书馆的文档以确保。