scala - 从资源目录读取文件的scala问题
问题描述
我写了这样的东西来从资源目录中读取文件:
val filePath = MyClass.getClass.getResource("/myFile.csv")
val file = filePath.getFile
println(file)
CSVReader.open(file)
我得到的结果是这样的:
file:/path/to/project/my_module/src/main/resources/my_module-assembly-0.1.jar!/myFile.csv
Exception in thread "main" java.io.FileNotFoundException: file:/path/to/project/my_module/src/main/resources/my_module-assembly-0.1.jar!/myFile.csv (No such file or directory)
然而,如果我在 IDE(Intellij)中运行相同的代码,没有问题,打印到控制台的路径是:
/path/to/project/my_module/target/scala-2.11/classes/myFile.csv
仅供参考,它是一个包含几个模块的多构建项目,我使用sbt assembly
解决方案
这与 Java 或 JVM 本身有关,而不是与 Scala 或 SBT 相关。
从 IDE 与命令行(或在 IDE 外部)运行应用程序时存在差异。该方法getClass.getResource(...)
尝试在当前类路径中查找资源 URL,这是关键的区别。
如果您查看 URL 本身,您会发现在第一种情况下您有my_module-assembly-0.1.jar!
一点,这意味着 URL 实际上指向 JAR 的内容,而不是指向可从文件系统访问的文件。
从您的 IDE 内部,您的类路径将包含磁盘上的源文件夹中的实际文件,因为 IDE 假定本身没有任何 JAR 文件。因此,在获取您提供的 URL 时getClass.getResource(...)
,您的 URL 中没有该my_module-assembly-0.1.jar!
位。
由于您想读取文件的内容,您可能需要执行getClass.getResourceAsStream(...)
. 无论您是在 IDE 中还是在其他任何地方,这都会为您提供InputStream
可以用来阅读内容的内容。
你的CSVReader
类可能有一个方法,允许它从一个InputStream
或一个Reader
或类似的东西中读取数据。
编辑:正如 Luis Miguel Mejia Suarez所指出的,从类路径读取文件的一种更 Scala 惯用的方法是使用Source.fromResource
method。这将返回一个BufferedSource
然后可用于读取文件内容的。
推荐阅读
- sql - DB2 在行插入时创建一个随机但唯一的字符标识符
- apache-kafka - 无法在 Spring Cloud kafka 中为每个主题/绑定器级别设置 serde、生产者和消费者属性
- r - ggplot中的叠加直方图和直方图边框
- terminal - 使用命令行终端在 Wifi 接入点上进行 MAC 地址阻止/过滤
- gitlab - 有没有办法使用python获取gitlab repo的目录结构
- xml - Powershell 更新 xml 未按预期工作
- javascript - 使用 chart.js 时在 react.js 中使用 props 传递值的问题
- mongodb - MongoDB 中的嵌套 $addFields
- laravel - Laravel - 将数组传递给@can Blade 模板
- excel - muPdf 能够读取伊朗(波斯语)数字吗?