Котлин читает файл вопроса - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь прочитать файл CSV, используя Джексона, но всякий раз, когда я на самом деле иду, чтобы объявить файл, я получаю следующее исключение:

IllegalStateException: classLoader.getResource("/src/integTest/testdata/Tests.csv") cannot be null
import com.fasterxml.jackson.databind.MappingIterator
import com.fasterxml.jackson.dataformat.csv.CsvMapper
import java.io.File

class CsvReader(private val fileName: String, private val testCase: TestCase) {

fun readCsv() {
    // configure schema and reader
    val mapper = CsvMapper()
    val schema = mapper.schemaFor(testCase.javaClass)
    val objectReader = mapper.readerFor(testCase.javaClass).with(schema)

//TODO this returns: java.lang.IllegalStateException: javaClass.getResource(fileName) must not be null
    val reader = File(javaClass.getResource(fileName).file).reader()

    //read file
    val mappingIterator: MappingIterator<TestCase> = objectReader.readValues(reader)
    while (mappingIterator.hasNext()) {
        //TODO get fields from read and return a TestCase Object
        println(mappingIterator.next())
    }
}

Я инициализирую класс, используя следующий путь к файлу в качестве параметра:

var FILE_NAME: String = "/src/integTest/kotlin/testdata/testCase.csv"

Кто-нибудь еще сталкивался с этой проблемой?

Ответы [ 3 ]

0 голосов
/ 10 мая 2018

Казалось, что 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()
    }
}
0 голосов
/ 15 мая 2019

Приведенный ниже код помогает,

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")
}
0 голосов
/ 10 мая 2018
File(javaClass.getResource(fileName).file).reader()

Это проблемный код. Вы пытаетесь прочитать ресурс как файл, но ресурс не является файлом. Он может храниться в вашей файловой системе, может быть упакован в файл JAR и т. Д. - поэтому Java возвращает URL вместо File при вызове Class.getResource.

Вместо этого вы должны использовать метод Class.getResourceAsStream и преобразовать его в считыватель:

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

Обратите внимание, что getResourceAsStream может вернуть ноль, если ресурс не найден.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...