Android 在 Java 中高效阅读大文本

Android Reading a large text efficiently in Java

我的代码太慢了

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

问题代码:

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();
            }
        }
        
    }
  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 是否为空,如果是则中断循环。

我新创建的代码:(我的测试设备是三星 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();
                }
            }

        }