Scala无法从资源文件夹读取文件

5
为什么以下代码无法从文件夹 resources 中读取 war-and-peace.txt 文件?
我的项目中的文件夹结构是由Intellij创建的标准Scala结构。
因为某些原因,只有当我将文件放在 src/main/scala 目录下(即我的Scala代码所在的位置),它才会读取此文件,但是当我将它放在 src/main/resources 目录下时,它会忽略此文件(在后一种情况下,我得到了一个 java.lang.NullPointerException 异常,顺便提一下,如果您打算建议这样做,那么当我尝试读取 “/war-and-peace.txt” (带有前导斜杠)时,我也会遇到相同的异常)。
val file = new File(classLoader.getResource("war-and-peace.txt").getFile())

Source.fromFile(file).....

我正在使用。
java version "1.8.0_101"
Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)

build.sbt:

name := "my-project"

version := "1.0"

scalaVersion := "2.11.8"

resourceDirectory in Compile := baseDirectory.value / "resources"

libraryDependencies += "junit" % "junit" % "4.12"

libraryDependencies += "org.scalatest" % "scalatest_2.11" % "2.2.4"

不要使用classLoader,而是使用getClass(getClass.getResource("/war-and-peace.txt").getFile())。 - Nagarjuna Pamu
2个回答

12

使用getClass而不是classLoader,并在资源名称/war-and-peace.txt前面加上/war-and-peace.txt文件必须位于资源文件夹中(src/main/resources)。

val file = getClass.getResource("/war-and-peace.txt").getFile()

Source.fromFile(file).getLines.foreach(println)

一行概括

Source.fromFile(getClass.getResource("/war-and-peace.txt").getFile).getLines().foreach(println)

getClass.getResourceAsStream更加可靠,因为它可以在代码被打包在JAR文件中时正常工作。

Source.fromInputStream(getClass.getResourceAsStream("/war-and-peace.txt")).getLines().foreach(println)

3
我尝试过之前在SO上发布的类似建议。但是,一旦我将输入文件从“scala”文件夹中移除并仅保留在“资源”文件夹中,仍然会出现NullPointerException。 - rapt
@rapt 你没有仔细阅读我的回答.. 使用 getClass 而不是 classLoader - Nagarjuna Pamu
也许你想比较一下你的 build.sbt 和我的。我不得不降级一些东西,因为我会遇到异常。 - rapt
1
@rapt 再试一次,并从您的 build.sbt 中删除此行 resourceDirectory in Compile := baseDirectory.value / "resources" - Nagarjuna Pamu
我从文件名中删除了“-”字符,然后它正常工作了。没有深入了解原因 :D - cipri.l
显示剩余3条评论

-1
我可以把 dummy.txt 放在 src/test/resources 中并运行一个测试用例来获取输出。

println(Source.fromResource("dummy.txt").getLines.length)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接