Android从内部存储读取文件非常慢

Posted

技术标签:

【中文标题】Android从内部存储读取文件非常慢【英文标题】:Android very slow to read file from internal storage 【发布时间】:2014-06-01 15:45:14 【问题描述】:

在我的应用程序中,我需要保存并加载一个小的 xml 文件。我想将其保存并加载到内部存储中,但我在读取此文件时遇到了速度问题。 这个文件非常小(大约 20/30 行)。 我试过这段代码:

        try 
        FileInputStream file = openFileInput("map.xml");
        int c;
        String xml = "";
        while( (c = file.read()) != -1)
            xml = xml + Character.toString((char)c);
        

        readXMLdata(xml);

        mapRestore = true;
     catch (Exception e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
    

然后我尝试使用此代码将相同的文件保存并加载到外部存储:

        String data = "";

    try 
        File myFile = new File(file_xml);
        FileInputStream fIn = new FileInputStream(myFile);
        BufferedReader myReader = new BufferedReader(new InputStreamReader(fIn));
        String aDataRow = "";
        String aBuffer = "";
        while ((aDataRow = myReader.readLine()) != null) 
            aBuffer += aDataRow + "\n";
        
        data = aBuffer;
        myReader.close();
     catch (Exception e) 
        Toast.makeText(getBaseContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
    

    return data;

我已经在我的 Nexus S 上进行了所有测试。如果使用内部存储,我会延迟读取文件(几秒钟),如果我使用外部存储,我没有它。

有什么办法吗?

【问题讨论】:

你试过MAT吗? 尽管我不敢相信这是真正的问题,但字符串连接是非常无效的,因为字符串是不可变的。我更喜欢某种 StringBuffer,在 while 循环中附加每个 String,最后在 StringBuffer 对象上调用 toString()。 【参考方案1】:

解决方案非常明显 - 只需使用 BufferedReader。在您的第二个示例中使用它,但在第一个示例中您不使用它。这就是为什么您在阅读性能方面存在差异的原因。

当您只有FileInputStream 并调用read 方法时,它实际上每次都会从内部存储中读取数据,这不是那么快。 当您使用BufferedReaderBufferedInputStream 时,数据将首先被读入内存缓冲区,然后当您调用readLine 时,数据将从该缓冲区中读取。它显着减少了内部存储上的 IO 操作数量,并且执行速度更快。

【讨论】:

以上是关于Android从内部存储读取文件非常慢的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 android studio 从应用程序中的内部或外部存储(SD 卡)读取文件?

Android14.1 内部文件存储和读取

Java / Android - 读取、操作 XML 文件并将其保存到内部存储

在读取/写入文件到内部/外部存储android时使用啥类和方法?

存储在磁盘上的 HashMap 从磁盘读回非常慢

android 内部文件读取