java - 读取 res/raw 中的文本文件,非常慢。使用缓冲阅读器

标签 java android

文本文件的大小为 560 KB,大约有 24500 行。每行都添加到列表中。也许我的手机又旧又慢?手机型号:三星 GT-S5570,Android 2.3.4。 阅读它大约需要 30 秒或更长时间,我很确定我的 Reader 类之外的算法不是问题。还有其他人遇到过类似问题或知道问题可能是什么吗?

        public class Reader {  

        public List<String> read(String file) {  
        Context ctx = ApplicationContextProvider.getContext();  
        List<String> entries = new ArrayList<String>();  

        //Get res/raw text-file id.  
        int resId = ctx.getResources().getIdentifier(file,"raw", ctx.getPackageName());  
        InputStream inputStream = ctx.getResources().openRawResource(resId);  

        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream), 8192);  

        try {  
             String test;  
             while (true) {  
                 test = reader.readLine();  

                 if (test == null)  
                     break;  
                 entries.add(test);  
            }  
            inputStream.close();  
            reader.close();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  

        return entries;  
    }  
} 

最佳答案

您描述的设备是一个非常旧且速度慢的设备。您应该注意通过以下方式尽可能加快阅读过程:

  • 将 ArrayList 初始化为大约预期条目的大小,以便在添加条目期间它不会多次调整自身大小。当数组增长时,这涉及多次大量操作,因为它必须在增长时再次复制所有以前的元素。
  • 一次读取整个文件,然后解析结果。

测量每个部分花费多少时间也是一个好主意 - 读取文件并将 24500 个字符串插入 ArrayList。糟糕的表现可能来自最意想不到的方向。

请尝试以下方法并分享结果(如果可能的话用时间测量):

private char[] readWholeFile(String file) {
    Context ctx = ApplicationContextProvider.getContext();
    int resId = ctx.getResources().getIdentifier(file, "raw", ctx.getPackageName());
    InputStream inputStream = ctx.getResources().openRawResource(resId);

    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream), 8192);
    try {
        int length = inputStream.available();
        char[] contents = new char[length];
        reader.read(contents, 0, length);
        return contents;
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    } finally {
        try {
            if (reader != null) reader.close();
        } catch (Exception e) {

        }
    }
}


public List<String> readEntries() {
    final int EXPECTED_ELEMENTS = 24500;

    char[] contents = readWholeFile("somefile");
    if (contents == null) {
        return new ArrayList<String>();
    }
    List<String> entries = new ArrayList<String>(EXPECTED_ELEMENTS);
    String test;
    BufferedReader reader = new BufferedReader(new CharArrayReader(contents));
    try {
        while ((test = reader.readLine()) != null) {
            entries.add(test);
        }
        return entries;
    } catch (IOException e) {
        e.printStackTrace();
        return new ArrayList<String>();
    } finally {
        try {
            if (reader != null) reader.close();
        } catch (Exception e) {

        }
    }
}

关于java - 读取 res/raw 中的文本文件,非常慢。使用缓冲阅读器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24219248/

相关文章:

java - 使用spring执行存储过程

Java - getServletContext().getAttribute() 返回 null

android - Box2d body 在暂停中停止并重新启动后移动得更快 [Android]

java - android looper和executor线程池的区别

java - "resolve"路径到底意味着什么?

java - 从 W 参数在主机端生成 ECDSA 公钥

java - 卡利Linux : Broken Java

android - 在自动模式下如何获取相机准确的白平衡参数值?

android - 包含的 xml 布局的访问 View

java - 在不获取 "Suspicious sign in prevented"的情况下发送电子邮件的替代方法