应用程序如何在 Documents 文件夹中写入和读取文件?

利维奥

我用 Android Studio 在 Kotlin 中编写了一个应用程序,将一些字符串写入文件。所有的工作,我都可以在应用程序内部读写,但是我看不到在 Documents 文件夹中查找的文件。如何使用文件夹 Documents 作为存储空间?谢谢

这些是我使用的功能:

fun saveTextFile(view: View, nomeFile: String, testo: String, contesto: Context){

    var fileStream: FileOutputStream
    try {
        fileStream = contesto.openFileOutput(nomeFile,  MODE_APPEND)              // OK esegue append
        fileStream.write(testo.toByteArray())
        fileStream.close()
    }catch (e: Exception){
        e.printStackTrace()
    }
}


fun readTextFile(view: View, nomeFile: String, contesto: Context): String{

    var fileInputStream: FileInputStream? = null
    fileInputStream = contesto.openFileInput(nomeFile)
    var inputStreamReader: InputStreamReader = InputStreamReader(fileInputStream)
    val bufferedReader: BufferedReader = BufferedReader(inputStreamReader)
    val stringBuilder: StringBuilder = StringBuilder()
    var text: String? = null
    while ({ text = bufferedReader.readLine(); text }() != null) {
        stringBuilder.append(text)
    }
    inputStreamReader.close();
    return(stringBuilder.toString())
}

谢谢你,利维奥

卡鲁内什·帕莱卡

要写入设备的 Documents 文件夹,您只需要使用 MediaStore 即可。你可以为这个函数输入任何你想要的东西,比如 String 、 bitmap 、 PdfDocument 等等。

对于您的用例,您可以执行以下操作,

全局变量:


    private var imageUri: Uri? = null

    override suspend fun saveDocument(context : Context, text : String) {
        withContext(Dispatchers.IO) {
            try {

                val collection =
                    MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)

                val dirDest = File(
                    Environment.DIRECTORY_DOCUMENTS,
                    context.getString(R.string.app_name)
                )
                val date = System.currentTimeMillis()
                val fileName = "$date.txt"


                val contentValues = ContentValues().apply {
                    put(MediaStore.MediaColumns.DISPLAY_NAME, fileName)
                    put(MediaStore.MediaColumns.RELATIVE_PATH, 
                    "$dirDest${File.separator}")
                    put(MediaStore.Files.FileColumns.IS_PENDING, 1)
                   

}

                }


                val imageUri = context.contentResolver.insert(collection, contentValues)


                withContext(Dispatchers.IO) {

                    imageUri?.let { uri ->
                        context.contentResolver.openOutputStream(uri, "w").use { out -> out?.write(text.toByteArray())
                        }
                        contentValues.clear()
                            contentValues.put(MediaStore.Files.FileColumns.IS_PENDING, 0)

                        context.contentResolver.update(uri, contentValues, null, null)
                    }
                }


            } catch (e: FileNotFoundException) {
                null
            }
        }
    }

要更新现有文件,请执行以下操作。第一次创建文件后,我将 imageUri 保存在全局变量中(如果您想永久/或暂时存储它,您可以使用 Jetpack Datastore / Shared Preference 来保存相同的内容):

 suspend fun updateData(context: Context,text : String){
        withContext(Dispatchers.IO) {
            try {

                val collection =
                    MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)

                val dirDest = File(
                    Environment.DIRECTORY_DOCUMENTS,
                    context.getString(R.string.app_name)
                )
                val fileName = "test.txt"


                val contentValues = ContentValues().apply {
                    put(MediaStore.MediaColumns.DISPLAY_NAME, fileName)
                    put(
                        MediaStore.MediaColumns.RELATIVE_PATH,
                        "$dirDest${File.separator}"
                    )
                    put(MediaStore.Files.FileColumns.IS_PENDING, 1)


                }




                withContext(Dispatchers.IO) {

                    imageUri?.let { uri ->
                        context.contentResolver.openOutputStream(uri, "wa").use { out ->
                            out?.write(text.toByteArray())
                        }
                        contentValues.clear()
                        contentValues.put(MediaStore.Files.FileColumns.IS_PENDING, 0)

                        context.contentResolver.update(uri, contentValues, null, null)
                    }
                }


            } catch (e: FileNotFoundException) {
                null
            }
        }

    }

要读取文件,请执行以下操作:

suspend fun read(context: Context, source: Uri): String = withContext(Dispatchers.IO) {
  val resolver: ContentResolver = context.contentResolver

    resolver.openInputStream(source)?.use { stream -> stream.readText() }
      ?: throw IllegalStateException("could not open $source")
}

private fun InputStream.readText(charset: Charset = Charsets.UTF_8): String =
  readBytes().toString(charset)

这是最终代码的样子:

class MainActivity : AppCompatActivity() {

    private lateinit var btn: Button
    private var imageUri: Uri? = null
    private lateinit var btn2: Button
    private lateinit var btn3 : Button

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        btn = findViewById(R.id.btnAdd)
        btn2 = findViewById(R.id.getText)
        btn3 = findViewById(R.id.updateText)
        btn.setOnClickListener {
            lifecycleScope.launch {
                saveDocument(applicationContext, "Original ")
            }
        }
        btn3.setOnClickListener {
            lifecycleScope.launch {
                updateData(applicationContext,"Appended")
            }
        }
        btn2.setOnClickListener {
            lifecycleScope.launch {
                imageUri?.let { it1 ->
                    val data = read(applicationContext, it1)

                    Toast.makeText(applicationContext, "The data is $data ", Toast.LENGTH_LONG)
                        .show()
                }
            }
        }
    }


    suspend fun saveDocument(context: Context, text: String) {
        withContext(Dispatchers.IO) {
            try {

                val collection =
                    MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)

                val dirDest = File(
                    Environment.DIRECTORY_DOCUMENTS,
                    context.getString(R.string.app_name)
                )
                val date = System.currentTimeMillis()
                val fileName = "test.txt"


                val contentValues = ContentValues().apply {
                    put(MediaStore.MediaColumns.DISPLAY_NAME, fileName)
                    put(
                        MediaStore.MediaColumns.RELATIVE_PATH,
                        "$dirDest${File.separator}"
                    )
                    put(MediaStore.Files.FileColumns.IS_PENDING, 1)


                }


                imageUri = context.contentResolver.insert(collection, contentValues)


                withContext(Dispatchers.IO) {

                    imageUri?.let { uri ->
                        context.contentResolver.openOutputStream(uri, "w").use { out ->
                            out?.write(text.toByteArray())
                        }
                        contentValues.clear()
                        contentValues.put(MediaStore.Files.FileColumns.IS_PENDING, 0)

                        context.contentResolver.update(uri, contentValues, null, null)
                    }
                }


            } catch (e: FileNotFoundException) {
                null
            }
        }

    }

    suspend fun updateData(context: Context, text: String) {
        withContext(Dispatchers.IO) {
            try {

                val collection =
                    MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)

                val dirDest = File(
                    Environment.DIRECTORY_DOCUMENTS,
                    context.getString(R.string.app_name)
                )
                val fileName = "test.txt"


                val contentValues = ContentValues().apply {
                    put(MediaStore.MediaColumns.DISPLAY_NAME, fileName)
                    put(
                        MediaStore.MediaColumns.RELATIVE_PATH,
                        "$dirDest${File.separator}"
                    )
                    put(MediaStore.Files.FileColumns.IS_PENDING, 1)


                }




                withContext(Dispatchers.IO) {

                    imageUri?.let { uri ->
                        context.contentResolver.openOutputStream(uri, "wa").use { out ->
                            out?.write(text.toByteArray())
                        }
                        contentValues.clear()
                        contentValues.put(MediaStore.Files.FileColumns.IS_PENDING, 0)

                        context.contentResolver.update(uri, contentValues, null, null)
                    }
                }


            } catch (e: FileNotFoundException) {
                null
            }
        }

    }


    suspend fun read(context: Context, source: Uri): String = withContext(Dispatchers.IO) {
        val resolver: ContentResolver = context.contentResolver

        resolver.openInputStream(source)?.use { stream -> stream.readText() }
            ?: throw IllegalStateException("could not open $source")
    }

    private fun InputStream.readText(charset: Charset = Charsets.UTF_8): String =
        readBytes().toString(charset)

我有三个按钮。首先我创建了一个文件,然后 uri 被存储在全局变量中。然后单击第二个按钮,我将其添加到已经存在的文件中,然后使用存储在全局变量中的相同 imageUri 使用第三个按钮读取文件

这是相同的演示。检查按下按钮的时间以及底部 Toast 形式的输出。

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Android设备上的内部存储中访问/读取/写入Documents文件夹?

React Native iOS从应用程序的Documents文件夹读取图像

如何在SwiftUI中位于Apple的Files应用程序的文件夹中写入文件?

如何在Swift中将文件写入位于Apple的Files应用程序的文件夹中

如何读取,写入和列出Google存储桶中的文件夹和文件?

在iOS应用中的documents文件夹内创建一个文件夹

如何读取和写入多个子文件夹?

将本地生成的PDF保存到iOS8中的应用程序的documents文件夹中

如何在GNOME应用程序菜单中创建应用程序文件夹?

如何读取Bash Shell中多个文件夹和子文件夹中的文件

从应用程序安装文件夹的子文件夹中读取文件

如何在Python的父目录中打开/读取/写入文件夹中的文件?

如何在 Documents 文件夹中指向一个文件夹?

如何在 Windows 上读取文件夹中的文本文件并写入 Kafka Topic

如何从SpringBoot应用程序的资源文件夹中读取所有文件?

Microsoft Graph应用程序权限-限制对特定文件/文件夹的读取/写入

Swift 3:如何获取保存在Documents文件夹中的文件的路径

如何读取和写入项目文件夹之外的 txt 文件 (Unity)

如何在React应用程序中从公用文件夹导入文件?

如何在Codeigniter应用程序的文件夹中访问CSS文件?

Rails 5:如何在应用程序模板脚本中添加文件夹和文件

如何在UWP应用程序的AppX中包含文件夹和文件?

通过有条件地更改每个应用程序的环境变量,停止在Windows用户Documents文件夹中创建垃圾邮件文件夹的程序

如何在Web应用程序的文件夹中的网页中填充下拉列表?

如何提供一个文件夹来从 Web 应用程序写入和下载临时文件?

如何在Web应用程序中读取属性文件?

如何在Lync Silverlight应用程序中读取/写入本地文件?

如何使用终端机转到Mac中的Documents文件夹

如何在32位应用程序中获取64位系统文件夹?