在res / raw中读取文本文件,非常慢。使用BufferedReader

时间:2014-06-14 11:01:19

标签: java android

文本文件的大小为560千字节,大约有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;  
    }  
} 

2 个答案:

答案 0 :(得分:1)

您描述的设备是一个非常古老而缓慢的设备。您应该尽可能地通过以下方式加快阅读过程:

  • 将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) {

        }
    }
}

答案 1 :(得分:0)

如果您使用来自apache“commons-io”的IOUtils,那就更容易了。

InputStream is = getResources().openRawResource(R.raw.yourNewTextFile);
String s = IOUtils.toString(is);
IOUtils.closeQuietly(is); // don't forget to close your streams

你可以从中下载它们 http://commons.apache.org/proper/commons-io/ 要么 http://mvnrepository.com/artifact/commons-io/commons-io