java - 在 Android 上读取内部文件的最佳方式?

标签 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). API available()说它不应该用于您需要的目的:

Note that this method provides such a weak guarantee that it is not very useful in practice.

这意味着它可能不会为您提供文件大小。

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

关于java - 在 Android 上读取内部文件的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17350123/

相关文章:

java - 与复合实体键的双向 OneToMany 关系导致空标识符

java - JComponent 不会显示图像

java - 连续写入Android中的文本文件

linux - 如何从 Haskell 为所有用户设置文件权限

java.lang.IllegalStateException : Request cannot be executed; I/O reactor status: STOPPED 错误

java - 如何将 JFrame 嵌入到 JavaFX 2.0 应用程序中?

android - 将选定的 TAB 设置为下方有一个小三角形

java - 二进制 XML 文件行 #14 : error inflating class fragment//showing maps

android - npm 安装时 react 导航错误

c - 在c中读取二进制文件的各个部分