在Android上阅读内部文件的最佳方式?

时间:2013-06-27 17:58:33

标签: java android file-io

我一直在谷歌搜索一些答案,我似乎无法找到最好的答案。

以下是我到目前为止在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指南中找到任何好的。

1 个答案:

答案 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包中的类被创建为更有效,但通常没有强烈的理由使用它们(不要陷入过早的优化罪)。

相关问题