【问题标题】:Access files in commonMain resources directory with OKIO - Kotlin Multiplatform使用 OKIO 访问 commonMain 资源目录中的文件 - Kotlin Multiplatform
【发布时间】:2022-11-19 21:36:22
【问题描述】:

我想在我的应用程序 (Kotlin Multiplatform Mobile) iOS + Android 中包含一个 .json 文件,以便在首次启动时使用 .initialData{} 解析并保存到 Realm DB 中。

我使用 expect/actual 模式并尝试访问 /resources/initialdata.json 中的文件

我正在尝试使用 OKIO 库(应该准备好与 Kotlin Multiplatform 一起工作):https://square.github.io/okio/recipes/

我在从 src/commonMain/resources 访问文件时遇到问题得到的是未找到 IO 错误路径:

java.io.FileNotFoundException: src/resources/initialdata.json: open failed: ENOENT (No such file or directory)

带有 .initialData 的领域配置如下所示:

        val config =
            RealmConfiguration.Builder(schema = schema)
                .name("boardDb-local")
                .initialData{
                    val jsonString = FileResourceParser().parseInitialFile()

                    val list: List<Exercise> = Json.decodeFromString(jsonString)
                    
                    val realmList: RealmList<Exercise> = realmListOf().also { it.addAll(list)}
                    for (item in realmList) {
                            copyToRealm(item, UpdatePolicy.ALL)
                        }
                }
                .log(LogLevel.ALL)
                .schemaVersion(1)
                .build()  


//Class with method with platform specific logic to get a file from resources and parse it. 
expect class FileResourceParser() {
    fun parseInitialFile(): String
}



//and in androidMain Module logic to read the file using OKIO

actual class FileResourceParser {


    val json = FileSystem.SYSTEM.read("src/resources/initialdata.json".toPath()) {
        //Read UTF8 logic
    }
       //some other manipulation
        return json
       
    }
}

问题:谁来定义 commonMain 资源文件夹的路径。我很困惑。

谢谢!

【问题讨论】:

    标签: kotlin io kotlin-multiplatform okio


    【解决方案1】:

    Okio 确实是多平台的,但这并不意味着它可以使用像这样的常规路径从资源中访问文件。您不应该尝试通过源文件中的路径来访问资源——当您在别处运行程序时,它们不会出现在这里。

    在 JVM 上,此类资源位于已编译的 JAR 中,因此您需要通过常规 J​​ava 工具访问它们。例如,SomeClass::class.java.getResource("/some-file.txt") 可从位于src/jvmMain/kotlin/* 中任意位置的类访问最初位于源代码src/commonMain/resources/some-file.txt 中的文件。也许要从 Okio 读取它,您可以改用 getResourceAsStream(),然后将流转换为 Okio 提供的任何内容。

    在 JS 平台上,您可能需要一些额外的 webpack 配置 + require() 调用来获取它们。见Embed resources in kotlin js

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多