代码之家  ›  专栏  ›  技术社区  ›  DevEx

从资源目录读取文件时出现scala问题

  •  1
  • DevEx  · 技术社区  · 6 年前

    我这样写是为了从资源目录中读取文件:

    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

    1 回复  |  直到 6 年前
        1
  •  3
  •   Alonso Dominguez    6 年前

    这与Java或JVM本身有关,而不是Scala或SBT。

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

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

    从您的IDE内部,类路径将包括磁盘上的实际文件、源文件夹中的文件,因为IDE假定没有任何JAR文件本身。因此,在获取 getClass.getResource(…) 您的URL没有 我的模块-组件-0.1.jar! 一点点。


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

    你的 CSVReader 类可能具有一个方法,该方法允许它从 输入流 或A Reader 或者类似的东西。

    编辑: 正如路易斯指出的那样 Miguel Mejia Suarez ,从类路径读取文件的一种更常用的scala方法是使用 Source.fromResource method . 这将返回 BufferedSource 然后可以用来读取文件内容。