如何在 Android 上读写 UTF-8 到磁盘?

Posted

技术标签:

【中文标题】如何在 Android 上读写 UTF-8 到磁盘?【英文标题】:How to read and write UTF-8 to disk on the Android? 【发布时间】:2011-02-13 16:29:15 【问题描述】:

我无法使用 android API 示例中显示的标准 InputStreamReader 方法读取和写入扩展字符(例如法语重音字符)到文本文件。当我使用以下方式读回文件时:

InputStreamReader tmp = new InputStreamReader(in);
BufferedReader reader = new BufferedReader(tmp);
String str;
while ((str = reader.readLine()) != null) 
...

读取的字符串在扩展字符处被截断,而不是在行尾处。然后字符串的后半部分出现在下一行。我假设我需要将我的数据保存为 UTF-8,但我找不到任何示例,而且我是 Java 新手。

谁能给我一个示例或相关文档的链接?

【问题讨论】:

这其实是一个一般的Java问题。 是通用Java吗?如果在 Android 上使用 openFileOutput 写入私有数据区,则没有带有 charset 选项的构造函数:developer.android.com/reference/android/content/… 【参考方案1】:

通过在项目资源管理器中右键单击文件并选择属性来检查文件的编码。如果它不是正确的编码,您需要在更改后重新输入特殊字符,或者至少这是我的经验。

【讨论】:

【参考方案2】:

当您实例化InputStreamReader 时,请使用接受字符集的构造函数。

InputStreamReader tmp = new InputStreamReader(in, "UTF-8");

OutputStreamWriter做类似的事情

我喜欢有一个

public static final Charset UTF8 = Charset.forName("UTF-8");

在我的代码中的一些实用程序类中,以便我可以调用(在Doc 中查看更多信息)

InputStreamReader tmp = new InputStreamReader(in, MyUtils.UTF8);

不必每次都处理UnsupportedEncodingException

【讨论】:

【参考方案3】:

如果您遇到任何此类问题,请尝试这样做。您必须将EncodeDecode 您的数据输入Base64。这对我有用。如果你需要,我可以分享代码。

【讨论】:

【参考方案4】:

这应该只适用于 Android,即使没有明确指定 UTF-8,因为默认字符集 UTF-8。如果您可以重现此问题,请在此处使用可重现的测试用例提出错误:

http://code.google.com/p/android/issues/entry

【讨论】:

我必须更改为 UTF-8 才能修复错误。我对我的用户有一个积极的结果,他们以前发现“扩展字符”,例如法语 E 抑扬符,导致文件无法正确重读。我让一个用户向我发送他的文件,当我在调试器中读回它时,我看到扩展字符被视为行尾。我还有原始文件。当我回到家时,我将运行一个测试项目,使用它们进行演示。代码见我的第一个问题:***.com/questions/2700983/…【参考方案5】:

非常简单明了。 :)

String filePath = "/sdcard/utf8_file.txt";
String UTF8 = "utf8";
int BUFFER_SIZE = 8192;

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), UTF8),BUFFER_SIZE);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filePath), UTF8),BUFFER_SIZE);

【讨论】:

谢谢。这在保存到私有数据区域时也有效吗? 当然。 openFileOutput(..) 上面没有任何特定于 Android 的内容。 是的。您可以将通用的new FileOutputStream(filePath) 替换为Android 的openFileOutput(..)

以上是关于如何在 Android 上读写 UTF-8 到磁盘?的主要内容,如果未能解决你的问题,请参考以下文章

kafka如何做到磁盘读写比内存读写还快?

如何在 Android 上使用 MediaStore 将数据从相机保存到磁盘?

Android 包裹,存储在内存中还是磁盘上?如何存储在磁盘上

Linux 如何测试 IO 性能(磁盘读写速度)

Android-Java读写文件到自身APP目录

如何在Mifare卡中编写UTF-8