gpt4 book ai didi

从资源目录读取文件的Scala问题

转载 作者:行者123 更新时间:2023-12-04 16:44:00 25 4
gpt4 key购买 nike

我写了这样的东西来从资源目录中读取文件:

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 构建 jar

最佳答案

这更多地与 Java 或 JVM 本身相关,而不是与 Scala 或 SBT 相关。

从 IDE 与命令行(或在 IDE 外部)运行应用程序时存在差异。方法getClass.getResource(...)尝试在 中查找资源 URL当前 类路径,这是关键的区别。

如果您查看 URL 本身,您会发现在第一种情况下您有一个 my_module-assembly-0.1.jar!其中有一点,这意味着 URL 实际上指向 JAR 的内容,而不是可从文件系统访问的文件。

从您的 IDE 内部,您的类路径将包括磁盘上的实际文件,来自源文件夹,因为 IDE 假定没有任何 JAR 文件本身。所以在获取getClass.getResource(...)给出的URL时您的 URL 没有 my_module-assembly-0.1.jar!位在其中。

既然你想读取文件的内容,你可能想要做一个 getClass.getResourceAsStream(...) .那会给你一个 InputStream无论您是在 IDE 中还是在其他任何地方,都可以使用它来读取内容。

您的 CSVReader类可能具有允许它从 InputStream 读取数据的方法。或 Reader或类似的东西。

编辑:正如 Luis Miguel Mejia Suarez 所指出的,从类路径中读取文件的更 Scala 惯用方法是使用 Source.fromResource method .这将返回 BufferedSource然后可用于读取文件内容。

关于从资源目录读取文件的Scala问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53543460/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com