【问题标题】:Continuously writing to a text file in Android在Android中不断写入文本文件
【发布时间】:2013-07-10 03:11:17
【问题描述】:

我知道这个问题之前可能已经被问过很多次,但我找不到满足我需求的示例。我之前在 StackOverflow 上问过几次问题,偶尔也有绅士让我“去看看书”或“做一些研究”,然后再在这里寻求帮助。好吧,我已经这样做了,但我没有找到足够的信息 - 所以如果你是其中的一员,如果你能给我指出一个资源,我将非常感激,这样我就知道在哪里挖掘。

不管怎样,我终于写完了一个计算带宽、链接速度和设备其他属性的应用程序。带宽每 5 秒刷新一次,链路速度和数据连接每秒刷新一次。目前,信息显示在屏幕上。

我正在尝试创建一个计划更大的项目,该项目涉及另一台计算机(指挥中心)监控设备的连接性,为此,设备必须将这些值保存到可以是 SSH 的文本文件中由指挥中心负责。这个问题是微不足道的;如何将数据写入文本文件?我知道如何在 Java 中做到这一点;我可以使用 FileOutputStream,或者结合 FileWriter + PrintWriter 来达到类似的效果。但是,我不知道目录在 Android 中是如何工作的,并且我不确定在 Android 中写入文件时是否应该注意任何预防措施。我注意到我需要说明如下内容:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

在清单中。还有什么我应该做的吗?另外,根据我的需要,任何人都可以推荐一种有效写入输出的方法吗? FileOutputStream 是否可行,因为它似乎相当容易?我应该以特定方式标记我的数据,例如用选项卡拆分它吗?我是编程新手,仍在学习,但我希望能得到一些帮助或有用的阅读建议。

This website,大概是首选阅读,目前已关闭。如果有人能提供一些示例,将不胜感激。

【问题讨论】:

  • 如果你要写信给/sdcard,你需要WRITE_EXTERNAL_STORAGE。您不需要它用于应用程序私有数据区域,例如/data/data/&lt;app&gt;/files。您可以从Context.getFilesDir() 获得后者;注意你的 Activity 是一个上下文。

标签: java android file-io tokenize


【解决方案1】:

Android 目录的工作方式类似于 PC 目录,唯一的例外是您可以拥有不同的“根”目录,例如内部或外部存储。更令人困惑的是,有些手机有一个内部 SD 卡 - 所以写入 SD 卡可能不是外部 SD 卡。当您编写文本文件时,您可能想要灵活一些 - 如果用户没有 SD 卡(外部存储),那么您需要更改您的游戏计划。有关检测 SD 卡的更多信息,请参阅this SO 帖子。

至于文本文件的实际写法,还是蛮漂亮的trivial

编辑:您应该使用getExternalFilesDir(null) 来获取应用程序的绝对外部路径。您必须在活动内部才能调用它(或有权访问 Context 对象)。

   File file = new File(getExternalFilesDir(null), "stats.txt");
   try
   {
      BufferedWriter buf = new BufferedWriter(new FileWriter(file)); 
      buf.append(text);
      buf.newLine();
      buf.close();
   }
   catch (IOException e)
   {
      // TODO Auto-generated catch block
      e.printStackTrace();
   }

请注意,在 Android 中进行文件 I/O 的方法有很多种,这只是其中一种。 Here 是另一篇详细说明该问题的博文。

要存储您的数据,我会做以下两件事之一:

首先,您可以将数据存储为 CSV(逗号分隔值)字符串,如下所示:

12,345,6,789

然后,当您解析它时,您会知道第一个数字是带宽,第二个是速度等。我宁愿使用逗号作为分隔符而不是制表符,因为我不喜欢使用空格作为分隔符.

其次,您可以使用键/值对设置,如下所示:

bandwidth=12
speed=34

然后在您的解析代码中,您可以拆分= 字符。第一个字符串是键,第二个是值。

【讨论】:

  • 不要使用固定的字符串路径,而是使用您应用程序的外部数据目录 - 您可以使用以下方法获取它:activity.getExternalFilesDir(null);这样,一旦卸载应用程序,数据就不会保留 :)
  • 这很好,我只是想举一个简单的例子。我会编辑我的答案
  • @crocboy 将文本文件存储在内部目录中会更容易吗?我看到这里保存的文件默认情况下只能由我的应用程序访问,有没有办法更改设置,所以我正在构建的命令中心也有权访问这些文件?
  • 抱歉,我刚刚注意到在我的 OP 中我特别提到了 id 喜欢写入外部存储。那是因为我对写入文本文件的工作方式有误解——如果内部文件可以被其他机器访问/ssh,我宁愿在内部编写,这样可以减少使用这个应用程序的要求。
  • 存储在内部目录中的文件只能通过您的应用程序访问,除非您根设备。写入外部存储意味着任何人都可以访问它。
【解决方案2】:

在撰写本文时,您的链接似乎是针对不同语言的,并且该版本似乎已关闭。英文版还在更新中,可以在这里找到:http://developer.android.com/training/basics/data-storage/files.html

同时,我相信您必须访问包含您的文本文件的原始目录(如果您还没有原始目录,请在 res 目录中创建一个原始目录并将文本文件放在那里)。访问文本文件的代码是getResources().openRawResource(resourceName)(如本问题所述:https://stackoverflow.com/a/2856501/555544)-我相信resourceName是您的R文件中所述的文本文件的ID(例如:R.raw.foo)-这个是 Android 如何在您的目录中查找文件的方式。然后,像往常一样进行文件 I/O。

让我知道进展如何 - 我自己也在学习 Android,但希望这指向正确的方向。

【讨论】:

  • 我在打开您的链接时收到 404 file not found 错误...我想知道是不是我的电脑很傻:/ 我尝试了多个浏览器
  • 奇怪...似乎对我有用(尽管您的链接给了我 404)
  • 有趣,当我复制粘贴链接时有效,但当我点击它时无效 - 当我点击它时,我被重定向到以下网页:developer.android.com/intl/zh-tw/training/basics/data-storage/… 好吧,现在它有效,我会给它一个很好的阅读。我是编程新手,也是安卓新手,但我会告诉你它的进展情况。感谢您的回复!
猜你喜欢
  • 1970-01-01
  • 2015-01-24
  • 2011-01-20
  • 1970-01-01
  • 2014-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多