Android使用Java有效读取大文本

问题描述 投票:1回答:2

我的代码太慢了

我如何有效地编写代码?当前代码需要几分钟才能读取文件,这太长了。可以更快地完成吗?没有堆栈跟踪,因为它可以工作,但是太慢了。谢谢!

问题代码:

private void list(){
        String strLine2="";
        wwwdf2 = new StringBuffer();

        InputStream fis2 = this.getResources().openRawResource(R.raw.list);
        BufferedReader br2 = new BufferedReader(new InputStreamReader(fis2));
        if(fis2 != null) {
            try {
                LineNumberReader lnr = new LineNumberReader(br2);
                String linenumber = String.valueOf(lnr);
                int i=0;
                while (i!=1) {
                    strLine2 = br2.readLine();
                    wwwdf2.append(strLine2 + "\n");
                    String contains = String.valueOf(wwwdf2);
                    if(contains.contains("itisdonecomplet")){
                       i++;
                    }
                }
              //  Toast.makeText(getApplicationContext(), strLine2, Toast.LENGTH_LONG).show();
                Toast.makeText(getApplicationContext(), wwwdf2, Toast.LENGTH_LONG).show();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
java android file android-studio bufferedreader
2个回答
3
投票
  1. 使用StringBuilder代替StringBuffer

    [StringBuffer]已同步,您不需要这样做。

  2. 不要使用String.valueOf,它会生成一个字符串,并使用StringBuffer / Builder取反值。您正在从整个缓冲区中构建一个字符串,进行检查,丢弃该字符串,然后再次构建几乎相同的字符串。

    改为使用if (wwwdf2.indexOf("itisdonecomplet") >= 0),这样可以避免创建字符串。

    但是这仍然会相当慢,因为即使您不会构造字符串并搜索所有字符串,您仍在搜索。

    您可以通过仅搜索字符串的最末尾来加快速度。例如,您可以使用wwwdf2.indexOf("itisdonecomplet", Math.max(0, wwwdf2.length() - strLine2.length() - "itisdonecomplet".length()))

    尽管,blackapps在注释中指出,您可以简单地检查strLine2是否包含该字符串。

  3. append的调用中不要使用字符串连接:请进行两个单独的调用。

    wwwdf2.append(strLine2);
    wwwdf2.append("\n");
    
  4. 您不检查是否到达文件末尾。检查strLine2是否为空,如果为空,则中断循环。


0
投票

我新创建的代码:(我的测试设备是三星S8)

 private void list(){
            String strLine2="";
            wwwdf2 = new StringBuilder();

            InputStream fis2 = this.getResources().openRawResource(R.raw.list);
            BufferedReader br2 = new BufferedReader(new InputStreamReader(fis2));
            if(fis2 != null) {
                try {
                    LineNumberReader lnr = new LineNumberReader(br2);
                    String linenumber = String.valueOf(lnr);
    int i=0;
                    while (i!=1) {
                        strLine2 = br2.readLine();
                        wwwdf2.append(strLine2);
                        wwwdf2.append("\n");
                        if (wwwdf2.indexOf("itisdonecomplet") >= 0){
                            i++;
                        }


                    }
                  //  Toast.makeText(getApplicationContext(), strLine2, Toast.LENGTH_LONG).show();
                    Toast.makeText(getApplicationContext(), wwwdf2, Toast.LENGTH_LONG).show();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
© www.soinside.com 2019 - 2024. All rights reserved.