Быстрое чтение файлов в массив строк

#java

#java

Вопрос:

мне нужно прочитать файл из java, который содержит более 500 000 строк, и мне было интересно, есть ли какие-либо способы ускорить процесс по сравнению с моим кодом:

     Scanner s1 = new Scanner(new FileInputStream(args[0]));
    while(s1.hasNextLine()) {
        temp  = s1.nextLine()   "n";
    }
    data = temp.split("\s ");
 

В начале все в порядке, но после 200000 строк

temp = s1.nextLine() «n»

в конечном итоге это занимает некоторое время. Конечный формат, который мне нужен, — это массив строк каждого слова.

Комментарии:

1. StringBuilder — лучший выбор здесь, по крайней мере, для добавления строк.

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

3. Если вам нужен массив каждого слова, зачем вы добавляете его в первую очередь? Просто прочитайте слово за словом и вставьте в массив.

Ответ №1:

Причина, по temp = s1.nextLine() "n" которой требуется много времени, заключается в том, что вы генерируете много строк. Фактически, для чтения N символов вы генерируете O (N) больших строк и копируете O (N ^ 2) символов.

Решением (просто) этого было бы добавление к a StringBuilder вместо использования String конкатенации. Однако здесь это не реальное решение, потому temp что строка не является вашей конечной целью. Ваша конечная цель — создать массив слов.

Что вам действительно нужно сделать, так это разбить каждую строку на слова и накапливать слова. Но накопление их непосредственно в массив не будет работать хорошо … потому что массивы не могут быть расширены. Итак, я рекомендую вам сделать следующее:

  1. создайте ArrayList<String> элемент для хранения всех слов
  2. прочитайте и разделите каждую строку на массив слов
  3. добавьте слова из массива в список всех слов
  4. когда вы закончите, используйте List.toArray для создания окончательного массива слов… или, может быть, просто оставьте слова в списке, если это более уместно.

Конечный формат, который мне нужен, — это массив строк каждого слова.

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

С другой стороны, если вам нужен список отдельных слов в файле, тогда вы должны использовать a Set , а не a List для накопления слов. В зависимости от того, что вы хотите сделать со словами next, HashSet , TreeSet или LinkedHashSet было бы уместно.

Ответ №2:

Вас интересует каждое слово? Или каждая строка? Кроме того, вы хотите, чтобы массив содержал строку каждого слова или строку каждой строки ..? В любом случае, как сказал Стивен, ArrayList — гораздо более приятный подход.

Вы могли бы:

 ArrayList<String> list = new ArrayList<>();

// each line as a string..
while (yourScanner.hasNextLine())
{
    list.add(yourScanner.nextLine());
}

// each word as a string..
while (yourScanner.hasNext())
{
    list.add(yourScanner.next());
}
 

Конкатенация строк может быть дорогостоящей, особенно до 200,00 слов с использованием решения с переменной «temp»…

Комментарии:

1. Вопросы следует задавать в комментариях, а не вставлять в ваш ответ.