Android Чтение большого текста эффективно на Java - PullRequest
1 голос
/ 25 октября 2019

Мой код слишком медленный

Как эффективно сделать мой код? В настоящее время для чтения файла требуется несколько минут, что слишком долго. Можно ли сделать это быстрее? Нет трассировки стека, потому что она работает, но слишком медленно. Спасибо!

Код проблемы:

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();
            }
        }

    }

Ответы [ 2 ]

3 голосов
/ 25 октября 2019
  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 голосов
/ 25 октября 2019

Мой новый созданный код: (Мое тестовое устройство - Samsung 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();
                }
            }

        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...