【问题标题】:Loading a directory from resource file and loading files into a list从资源文件加载目录并将文件加载到列表中
【发布时间】:2019-10-13 02:07:59
【问题描述】:

调用 getClass.getResource() 时找不到目录

路径是 src -> main -> 资源 -> RocheFiles

我试过绝对路径。我目前在 RocheFiles 目录中有 39 个 csv 文件。

val testCaseDirectory = getClass.getResource("/RocheFiles")
    val directory = new File(testCaseDirectory.getPath)
    val testCases = if (directory.exists && directory.isDirectory) {
        directory
        .list
        .map(s => new File(directory.getAbsolutePath + "/" + s))
        .filter(s => s.exists && s.isDirectory)
        .sortBy(f => f.getName)
        .toList
    } else List.empty

    println(testCaseDirectory)
    println(directory)
    println(testCases)

这里是 println 结果:

jar:file:/var/folders/yr/tvnq7crd3mvdn0s3kyv_q4t00000gn/T/sbt_43463083/job-10/target/d5caefa1/rocheapp_2.12-0.1.0.jar!/RocheFiles
file:/var/folders/yr/tvnq7crd3mvdn0s3kyv_q4t00000gn/T/sbt_43463083/job-10/target/d5caefa1/rocheapp_2.12-0.1.0.jar!/RocheFiles
List()
List()

我试过了

val testCaseDirectory = getClass.getResource("/RocheFiles")
    val directory = new File(testCaseDirectory.getPath)

    // for c,d,e,f
    val cdef = directory.listFiles.toList
               .filter(_.isDirectory)
               .flatMap(p => new File(p.getPath).listFiles)

    println(cdef)

仍然出现空指针异常

[error] Total time: 2 s, completed Oct 12, 2019, 12:55:09 AM
sbt:rocheApp> run
[error] (run-main-c) java.lang.NullPointerException
[error] java.lang.NullPointerException

我可以一次直接提取 1 个文件 - 使用这个:不确定如何读取目录并遍历每个 CSV 文件。

override def readRoche(): List[List[String]] = {
    for {
      line <- Source.fromFile(fileName).getLines().toList
      values = line.split('|').toList
    } yield values}
}

这是 CSVReader 的执行。

val rocheLines = new CSVReader("src/main/resources/RocheFiles/BP40331_UBSC_QRS3_PROD_OPEN_20190926121416.csv").readRoche()

更新:我将目录移到资源目录之外,我可以使用下面的代码读取 csv 文件

def getListOfFiles(dir: String):List[File] = {
        val d = new File(dir)
        if (d.exists && d.isDirectory) {
            d.listFiles.filter(_.isFile).toList
        } else {
            List[File]()
        }
}
val testCaseDirectory = getListOfFiles("src/main/scala/corp/marshconsult/bracketProjects/rocheApp/RocheFiles")

仍然不确定为什么我能够在资源目录中找到单个文件,但不能在资源目录中找到目录。

【问题讨论】:

    标签: java scala


    【解决方案1】:

    您可以使用listFiles 列出所有对象,使用isFileisDirectory 确定文件或文件夹。

    如果目录结构是这样的

    - main
    -- resources
    --- RocheFiles
    ---- a.txt
    ---- b.txt
    ---- dir1
    ----- c.txt
    ----- d.txt
    ---- dir2
    ----- e.txt
    ----- f.txt
    

    获取这些文件只需

      val testCaseDirectory = getClass.getResource("/RocheFiles")
      val directory = new File(testCaseDirectory.getPath)
    
      // for a,b files
      val ab = directory.listFiles.filter(_.isFile)
    
      // for c,d,e,f
      val cdef = directory.listFiles.toList
                 .filter(_.isDirectory)
                 .flatMap(p => new File(p.getPath).listFiles)
    
    

    【讨论】:

    • 我为 c、d、e、f 运行了这些,但仍然收到空指针异常 - @inmyth
    • val directory = new File(testCaseDirectory.getPath) 这是获取 NPE。
    • 换句话说,val testCaseDirectory = getClass.getResource("/RocheFiles") 为空。您需要检查拼写错误或该目录是否存在于正确的位置
    • 它被复制到 scala-2.12 -> classes -> RocheFiles 下的目标目录中 - 另外,当我运行它工作的 csv 文件之一的绝对路径时。
    • 是的,这是正确的行为。资源文件夹中的内容将被复制到构建目录以供运行时执行。
    猜你喜欢
    • 2016-02-18
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    相关资源
    最近更新 更多