【问题标题】:New to Android, stuggling to write to .csv file on external storageAndroid 新手,难以在外部存储上写入 .csv 文件
【发布时间】:2023-03-17 21:07:01
【问题描述】:

安卓 4.4.4 编写一个简单的应用程序来学习 Android 编程的基础知识。 运行调试版本(在我的设备上而不是在模拟器中),无论是在 Android Studio 的 USB 调试中,还是从 USB 断开后的设备上。

我只是想将文本数据写入外部存储上的文本文件。在这个阶段不要关心它是内部存储还是 SD 卡(安装了 SD 卡)。

我已在清单中设置了 WRITE_EXTERNAL_STORAGE 权限。 我正在检查外部存储是否已安装 - 确实如此。

我已经尝试了我找到的代码here:

File file = new File(myContext.getExternalFilesDir(null), "state.txt");
  try {

 FileOutputStream os = new FileOutputStream(file, true); 
 OutputStreamWriter out = new OutputStreamWriter(os);
     out.write(data);
 out.close();
}

我将文件名记录到 LOGCAT,它显示为 /storage/emulated/0/Android/data/com.amazed.matthew.brunel/files/file.csv

这看起来很合理。没有抛出异常,代码运行良好,只是没有创建文件!!那么,是因为我在调试中而在其他地方创建了一个文件,还是什么?我错过了什么吗?

谢谢。

【问题讨论】:

  • 1) 它是什么 - state.txtfile.csv? 2) 什么是data
  • ps.: csv 文件对于 Android 来说是一个非常糟糕的替代方案。有更好的数据存储,例如 SQLite 和 SharedPreferences
  • @Budius - 代码 sn-p 是从给定的链接粘贴的。我的文件名是按照完整路径/stor....../file.csv。选择 csv 是因为平面文件适合应用并且数据不需要索引,所以应该紧凑且快速。
  • 没有索引,紧凑且快速。谷歌搜索“android sharedpreferences”。我再说一遍*.csv 对于 Android 来说是一个非常糟糕的选择。
  • 很高兴告诉我为什么 csv 不好 - 但到目前为止你还没有告诉我!!!

标签: android android-external-storage


【解决方案1】:

按照 Android 文档中的 this 示例,您可以执行以下操作:

void write() {
    File file = new File(getExternalFilesDir(null), "state.txt");

    try {
        OutputStream os = new FileOutputStream(file);
        os.write(data);
    } catch (IOException e) {
        Log.w("ExternalStorage", "Error writing " + file, e);
    } finally {
        os.close();
    }
}

不使用OutputStreamWriter,还请记住,根据文档:

从 KITKAT 开始,无需权限即可读取或写入 返回的路径;调用应用程序始终可以访问它。这 仅适用于为调用的包名生成的路径 应用。要访问属于其他包的路径, WRITE_EXTERNAL_STORAGE 和/或 READ_EXTERNAL_STORAGE 是必需的。

【讨论】:

    【解决方案2】:

    好的,我不完全理解为什么行为如下所述,但基本问题已解决。

    我关闭了设备并重新启动 - 下次我连接 USB 电缆并在我的主机调试机器上查看 Windows 资源管理器时......有我的文件。所以我不知道为什么不重启设备就看不到它们,但它们就在那里。 奇怪!!

    【讨论】:

    • 这是因为 MTP 连接(Android 设备或模拟器与 PC 之间的 USB 连接)不是直接连接到 Android 文件系统,而更像是连接文件系统的桥梁中间缓存。因此,重新启动设备会刷新此缓存。使用某种类型或文件管理器或终端检查文件是直接访问,不会出现此问题。
    • @Budius - 仍然奇怪的是我有两个测试设备,它们的行为不同。我描述的是 4.4.4 上的摩托罗拉手机,但 4.4.2 上的三星平板电脑不是!一切都立即在三星上可见。在完成的应用程序中不会成为问题 - 只是在开发过程中有点尴尬。感谢您的帮助。
    • 不是 100% 肯定,但据我记得,三星设备上的 SD 卡是直接连接到文件系统的。它们的行为就像 USB 闪存驱动器。是的,Android 的世界充满了这些怪异之处。这是为它开发的乐趣的一部分
    猜你喜欢
    • 1970-01-01
    • 2012-01-09
    • 2012-08-11
    • 2019-02-09
    • 1970-01-01
    • 2016-10-14
    • 2015-10-21
    • 1970-01-01
    相关资源
    最近更新 更多