如何在安卓系统上读写UTF-8格式的磁盘文件?

9

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

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

读取的字符串在扩展字符处被截断,而不是在行尾处。然后字符串的后一半出现在下一行。我猜我需要将数据持久化为UTF-8,但我找不到任何例子,而我对Java不熟悉。

是否有人能提供给我一个示例或相关文档的链接?


1
这实际上是一个通用的Java问题。 - itsadok
这是一般的Java吗?如果您在Android上使用openFileOutput写入私有数据区域,则没有带有字符集选项的构造函数:http://developer.android.com/reference/android/content/Context.html#openFileOutput%28java.lang.String,%20int%29 - Rob Kent
5个回答

26

非常简单和直接。 :)

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);

谢谢。当保存到私有数据区时,这是否有效? - Rob Kent
当然,openFileOutput(..) 上面没有任何与 Android 特定的内容。 - yanchenko
4
可以使用Android的openFileOutput(..)替换通用的new FileOutputStream(filePath) - yanchenko

10

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

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

使用 OutputStreamWriter 进行类似的操作。

我喜欢有一个

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

我需要在我的代码中的某个实用类中调用(详见文档)。

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

而不必每次都处理UnsupportedEncodingException


1

这应该在 Android 上正常工作,即使没有显式指定 UTF-8,因为默认字符集 UTF-8。如果您能够重现此问题,请在此处提出一个可重现的测试用例错误:

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


我必须更改为UTF-8来修复错误。我的用户以前发现“扩展字符”,例如法语E带圆形符号,会导致文件无法正确读取,但现在他们对此有了积极的结果。我让一个用户将他的文件发送给我,当我在调试器中读取它时,我发现扩展字符被视为行结束符。我仍然拥有原始文件。当我回到家时,我将使用它们运行一个测试项目来演示。请参见我的第一个问题的代码:http://stackoverflow.com/questions/2700983/problem-saving-file-on-motorola-droid-android-2-1 - Rob Kent

0

如果你遇到类似的问题,请尝试这样做。你需要将你的数据进行Base64编码和解码。这对我有用。如果需要,我可以分享代码。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接