通过 Jetpack Compose 中的打开文件对话框打开简单文本文件并逐行读取

问题描述 投票:0回答:2

我想打开一个简单的文本文件并逐行阅读此内容:

我触发了打开文件对话框就像这里

val result = remember { mutableStateOf<Uri?>(null) }
val launcher = rememberLauncherForActivityResult(ActivityResultContracts.OpenDocument()) {
    result.value = it
}

Button(onClick = { launcher.launch(arrayOf("text/plain")) }) {
    Text(text = "Open Document")
}

Loadfile(result.value)

result.value
属于
Uri
类型,我尝试打开文件:

@Composable
fun Loadfile(uri: Uri?) {

    Log.d("Loadfile", "Load ${uri.toString()}")

    if(uri==null) {
        Log.e("Loadfile", "File could not load!")    
    } else {
        val file = File(uri.path)
        try {
            BufferedReader(FileReader(file)).use { br ->
                Log.d("Loadfile", "Total Lines: ${br.lines()}")
            }
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }
}

但不幸的是 IOException 捕获了 java.io.FileNotFoundException:/document/document:1000014685:打开失败:ENOENT(没有这样的文件或目录)

文本文件名为 lola.txt,位于 Android 内部

Documents
文件夹中;我不知道1000014685是哪里来的!? 我做错了什么?

kotlin android-jetpack
2个回答
0
投票

使用文件专用方法打开

URI
URL
很少是合适的。您应该使用
InputStream
方法直接打开
URL.openStream()

@Composable
fun Loadfile(uri: Uri?) {
    Log.d("Loadfile", "Loading $uri")

    if (uri == null) {
        Log.e("Loadfile", "File could not be loaded.")    
    } else {
        try {
            uri.toURL().openStream().bufferedReader().useLines { lines ->
                Log.d("Loadfile", "Total Lines: ${lines.count()}")
            }
        } catch (e: IOException) {
            log.e("Loadfile", "Exception trying to load $uri", e)
        }
    }
}

0
投票

我使用

contextResolver
:

让它工作
@Composable
fun LoadFileFromUri(uri: Uri?) {
    val contentResolver = LocalContext.current.contentResolver

    if(uri==null) {
        Log.e("LoadFileFromUri", "Unable to load the file")    
    } else {
        val inputStream = contentResolver.openInputStream(uri)
        val reader = BufferedReader(InputStreamReader(inputStream))
        var line = reader.readLine()

        while (line != null) {
            Log.d("LoadFileFromUri", line)
            line = reader.readLine()
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.