我一直在谷歌搜索一些答案,我似乎无法找到最好的答案。
以下是我到目前为止在Android上阅读内部文件的内容:
fis = openFileInput("MY_FILE");
StringBuilder fileContent = new StringBuilder("");
byte[] buffer = new byte[fis.available()];
while (fis.read(buffer) != -1) {
fileContent.append(new String(buffer));
}
MYVARIABLE = fileContent.toString();
fis.close();
它用来留下很多空格,但我只是使用.available方法来返回我需要的东西。
是否有更快或更短的方式来写这个?我似乎无法在API指南中找到任何好的。
答案 0 :(得分:1)
1)。 available()的API表示不应将其用于您需要的目的:
请注意,此方法提供了这样一种弱保证,即它在实践中不是很有用。
意思是它可能不会给你文件大小。
2)。当你在RAM中读取smth时,考虑到文件可能很长,所以尽量避免花费额外的RAM。为此,使用相对较小(1~8 KB)的缓冲区从源读取然后附加到结果。另一方面,使用太小的缓冲区(比如几个字节)会大大减慢读取速度。
3)。读取字节与读取字符不同,因为单个字符可能由多个字节表示(取决于编码)。要读取字符,使用了特定类,它们知道编码并知道如何正确地将字节转换为字符。例如,InputStreamReader就是其中一类。
4)。用于读取的编码应该是用于保存数据的编码。
考虑到以上所述,我会像这样使用smth:
public static String getStringFromStream(InputStream in, String encoding)
throws IOException {
InputStreamReader reader;
if (encoding == null) {
// This constructor sets the character converter to the encoding
// specified in the "file.encoding" property and falls back
// to ISO 8859_1 (ISO-Latin-1) if the property doesn't exist.
reader = new InputStreamReader(in);
} else {
reader = new InputStreamReader(in, encoding);
}
StringBuilder sb = new StringBuilder();
final char[] buf = new char[1024];
int len;
while ((len = reader.read(buf)) > 0) {
sb.append(buf, 0, len);
}
return sb.toString();
}
5)。确保在使用完毕后始终关闭InputStream
。
当然,在Java / Android中从文件中读取文本的方法不止一种。这主要是因为Java API包含几代IO API。例如,java.nio
包中的类被创建为更有效,但通常没有强烈的理由使用它们(不要陷入过早的优化罪)。