Java Kotlin读取文件问题

Java Kotlin读取文件问题,java,kotlin,jackson,Java,Kotlin,Jackson,我试图使用jackson读取csv文件,但每当我实际去声明该文件时,我会得到以下异常: IllegalStateException:classLoader.getResource(“/src/integTest/testdata/Tests.csv”)不能为空 还有人遇到过这个问题吗 File(javaClass.getResource(fileName).file).reader() 这就是有问题的代码。您试图将资源作为文件读取,但资源不是文件。它可能存储在您的文件系统中,也可能打包在JA

我试图使用jackson读取csv文件,但每当我实际去声明该文件时,我会得到以下异常:

IllegalStateException:classLoader.getResource(“/src/integTest/testdata/Tests.csv”)不能为空
还有人遇到过这个问题吗

File(javaClass.getResource(fileName).file).reader()
这就是有问题的代码。您试图将资源作为文件读取,但资源不是文件。它可能存储在您的文件系统中,也可能打包在JAR文件中,等等-这就是为什么Java在调用时返回
URL
,而不是
文件

相反,您应该使用该方法并将其转换为读取器:

javaClass.getResourceAsStream(fileName)?.let { InputStreamReader(it) }

请注意,如果找不到资源,
getResourceAsStream
可能会返回null。

Gradle似乎正在src/resources目录中查找该文件

此外,kotlin似乎不能很好地使用java,因此我添加了Jackson kotlin模块

使用泛型,以便代码可以在其他地方重用。现在似乎工作得很好

以下是新代码:

import com.fasterxml.jackson.databind.MappingIterator
import com.fasterxml.jackson.dataformat.csv.CsvMapper
import com.fasterxml.jackson.dataformat.csv.CsvSchema
import com.fasterxml.jackson.module.kotlin.KotlinModule
import org.springframework.core.io.ClassPathResource


inline fun <reified T> readCsv(filename: String): List<T> {
    // configure mapper, schema and reader
    val mapper = CsvMapper().apply { registerModule(KotlinModule()) }
    val bootstrapSchema = CsvSchema.emptySchema().withHeader()
    val objectReader = mapper.readerFor(T::class.java).with(bootstrapSchema)

    //Read File and produce list from CSV
    ClassPathResource(filename).inputStream.use {
        val mappingIterator: MappingIterator<T> = objectReader.readValues(it)

        val items = mutableListOf<T>()

        mappingIterator.forEach { items.add(it) }

        return items.toList()
    }
}
import com.fasterxml.jackson.databind.MappingIterator
导入com.fasterxml.jackson.dataformat.csv.CsvMapper
导入com.fasterxml.jackson.dataformat.csv.CsvSchema
导入com.fasterxml.jackson.module.kotlin.KotlinModule
导入org.springframework.core.io.ClassPathResource
inline fun readCsv(文件名:String):列表{
//配置映射器、架构和读取器
val mapper=CsvMapper()。应用{registerModule(KotlinModule())}
val bootstrapSchema=CsvSchema.emptySchema().withHeader()
val objectReader=mapper.reader for(T::class.java).with(bootstrapSchema)
//从CSV读取文件并生成列表
ClassPathResource(文件名).inputStream.use{
val mappingIterator:mappingIterator=objectReader.readValues(it)
val items=mutableListOf()
mappingIterator.forEach{items.add(it)}
return items.toList()
}
}
下面的代码有帮助

fun getResource(fileName: String): String {
    val clazzLoader = this::class.java.classLoader
    val stream = clazzLoader.getResourceAsStream(fileName)
    val reader = stream.bufferedReader()
    if (!Objects.isNull(reader)) {
        val data = reader.readText()
        reader.close()
        return data
    }
    throw RuntimeException("The requested file $fileName not found")
}

您的文件名不正确当前的javaClass.getResource指向哪个位置?我怀疑你的道路可能不正确
import com.fasterxml.jackson.databind.MappingIterator
import com.fasterxml.jackson.dataformat.csv.CsvMapper
import com.fasterxml.jackson.dataformat.csv.CsvSchema
import com.fasterxml.jackson.module.kotlin.KotlinModule
import org.springframework.core.io.ClassPathResource


inline fun <reified T> readCsv(filename: String): List<T> {
    // configure mapper, schema and reader
    val mapper = CsvMapper().apply { registerModule(KotlinModule()) }
    val bootstrapSchema = CsvSchema.emptySchema().withHeader()
    val objectReader = mapper.readerFor(T::class.java).with(bootstrapSchema)

    //Read File and produce list from CSV
    ClassPathResource(filename).inputStream.use {
        val mappingIterator: MappingIterator<T> = objectReader.readValues(it)

        val items = mutableListOf<T>()

        mappingIterator.forEach { items.add(it) }

        return items.toList()
    }
}
fun getResource(fileName: String): String {
    val clazzLoader = this::class.java.classLoader
    val stream = clazzLoader.getResourceAsStream(fileName)
    val reader = stream.bufferedReader()
    if (!Objects.isNull(reader)) {
        val data = reader.readText()
        reader.close()
        return data
    }
    throw RuntimeException("The requested file $fileName not found")
}