Java Android читает полный файл быстро - PullRequest
4 голосов
/ 15 сентября 2011

У меня есть следующий фрагмент кода, чтобы прочитать все содержимое текстового файла в строку.Это работает, единственная проблема ... это очень медленно (файл имеет длину около 1500 строк).

            InputStream is = this.getResources().openRawResource(R.raw.comp_rules_glossary);
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String previousLine = "start";

            while ((readLine = br.readLine()) != null)
            {
                rules = rules + readLine + eol;
                if (previousLine.equals(""))
                {
                    content = content + readLine + eol;
                }
                previousLine = readLine;
            }

            is.close();
            br.close();

В данный момент я читаю полный файл по одной строке за раз, затемдобавив его в строку.Есть ли более быстрый способ сделать это?Я ищу быстрый способ получить весь файл в строку.

Ответы [ 3 ]

3 голосов
/ 15 сентября 2011

Используйте StringBuilder для создания больших строк.

StringBuilder sb_rules = new StringBuilder();
StringBuilder sb_content = new StringBuilder();
while ((readLine = br.readLine()) != null)
{
    sb_rules.append(readLine);
    sb_rules.append(eol);
    if (previousLine.equals(""))
    {
        sb_content.append(readLine);
        sb_content.append(eol);
    }
    previousLine = readLine;
}
content = sb_rules.toString();
content = sb_content.toString();

Почему StringBuilder при наличии строки?

String неразрешить добавлениеКаждый метод, который вы вызываете для String, создает новый объект и возвращает его.Это потому, что String является неизменным - он не может изменить свое внутреннее состояние.

1 голос
/ 29 сентября 2011

При условии, что Apache Commons отлично работает на Android, не могли бы вы использовать что-то подобное?

InputStream is = this.getResources().openRawResource(R.raw.comp_rules_glossary);
String text = IOUtils.toString(is, "UTF-8");

(или вы можете использовать Guava и его помощник CharStreams, но обычно он более подробный)

Если нет причины, по которой вы хотите избегать сторонних библиотек?

1 голос
/ 15 сентября 2011

Я вижу, что у вас уже есть работающее решение, основанное на комментариях Кевина, но может быть полезно понять, почему ваш старый код был медленным.

Проблема в том, что когда вы объединяете строки напрямую с помощью оператора + или с помощью метода concat(), он фактически создает новую строку с результатом объединения. Это включает в себя копирование всего содержимого обеих строк, которые вы объединяете. Поэтому, когда вы читаете файл и создаете строку содержимого, каждый раз, когда вы добавляете к нему, вы создаете еще одну копию всего, что у вас есть в содержимом.

Решение, которое, как я предполагаю, заключается в том, что вы делаете сейчас, заключается в использовании класса StringBuffer, который представляет собой динамический буфер, который позволяет вам изменять его содержимое (т.е. добавлять новые данные в конец), без всегда приходится выделять новый объект String и копировать в него все.

Главное, что вы должны иметь в виду, это то, что строки в java неизменны. Каждый раз, когда вы вызываете метод для строки Java, который каким-либо образом его изменяет, он фактически создает новую копию строки с результатом изменения.

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