我想打开一个简单的文本文件并逐行阅读此内容:
我触发了打开文件对话框就像这里:
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是哪里来的!?
我做错了什么?
使用文件专用方法打开
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)
}
}
}
我使用
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()
}
}
}