【问题标题】:How to read json file from path using kotlin如何使用 kotlin 从路径中读取 json 文件
【发布时间】:2019-04-29 17:29:45
【问题描述】:

我正在尝试在 android 中打开一个文件选择器,选择一个 json 文件然后从中获取文本。 选择文件后应用程序崩溃,因为它找不到路径。

我已尝试添加外部存储读/写权限并更改路径格式

/// some Activity code
val myFileIntent=Intent()
.setType("*/*")
.setAction(Intent.ACTION_GET_CONTENT)
startActivityForResult(myFileIntent,10)

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        val path = data!!.data.path
        val jsonContent = File(path).readText()
    }

【问题讨论】:

  • 请发布堆栈跟踪
  • 嗨,这可能很有趣stackoverflow.com/a/36129285/235354
  • 引起:java.io.FileNotFoundException: /document/raw:/storage/emulated/0/Download/reteta.json (没有这样的文件或目录) 在 java.io.FileInputStream.open0( Native Method) at java.io.FileInputStream.open(FileInputStream.java:231) at java.io.FileInputStream.(FileInputStream.java:165) at kotlin.io.FilesKt__FileReadWriteKt.readBytes(FileReadWrite.kt:63)在 kotlin.io.FilesKt__FileReadWriteKt.readText(FileReadWrite.kt:101)

标签: android json kotlin


【解决方案1】:

我正在尝试在 android 中打开文件选择器

这不是文件选择器。这允许用户选择一段内容,可能是也可能不是文件。

选择文件后应用崩溃

您没有选择文件。您正在挑选一段内容。该内容由Uri 标识,您的Uri 的方案是content,而不是file

使用ContentResolveropenInputStream()Uri 标识的内容上获取InputStream。您可以在 InputStream 上调用 readText() 以将其作为文本读入。

【讨论】:

  • 您对我如何实现它有什么建议吗?
  • 这是做不到的。您不能在该 InputStream 上调用 readText() 以将其作为文本读取。
  • @TeodorRadu:啊,抱歉,我记错了。您需要将InputStream 转换为BufferedReaderstackoverflow.com/a/39500046/115145
【解决方案2】:

这是我最后的工作代码:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        val path = data?.data
        val jsonSelectedFile =  contentResolver.openInputStream(path);
        val inputAsString = jsonSelectedFile.bufferedReader().use { it.readText() }

        Toast.makeText(this, "Json: " +  inputAsString , Toast.LENGTH_LONG).show()
    }

对于调用:

 importJsonButton.setOnClickListener {
            val myFileIntent = Intent()
                .setType("*/*")
                .setAction(Intent.ACTION_GET_CONTENT)

            startActivityForResult(myFileIntent,10)
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 2018-01-07
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 2023-04-08
    相关资源
    最近更新 更多