Как мы определяем количество строк в текстовом файле?

#java #text #io

#java #текст #io

Вопрос:

Всем привет, у меня есть локальный файл, который выглядит следующим образом:

 AAA   Anaa
AAC   EL-ARISH
AAE   Annaba 
AAF   APALACHICOLA MUNI AIRPORT
AAG   ARAPOTI
AAL   Aalborg Airport
AAM   Mala Mala
AAN   Al Ain 
AAQ   Anapa
AAR   Aarhus Tirstrup Airport
AAT   Altay
AAX   Araxa
AAY   Al Ghaydah
...
  

В руководствах по Java предлагается оценить количество строк в файле, выполнив java.io.File.length
и разделяем результат на 50.

Но нет ли более «надежного» способа получить количество строк в текстовом файле (при этом не оплачивая накладные расходы на чтение всего файла)?

Ответ №1:

Разве вы не можете просто прочитать файл с помощью FileReader и посчитать количество прочитанных строк?

 int lines = 0;
BufferedReader br = new BufferedReader(new FileReader("foo.in"));
while (br.readLine != null) {
    lines  ;
}
  

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

1. Но есть ли способ сделать это, не оплачивая накладные расходы на чтение всего файла?

2. Нет. Как еще вы могли бы это сделать? Файл — это просто поток байтов, часть из которых — ‘n’, который, как мы решаем, разделяет строки. Не удается получить что-то даром.

3. Кстати, мне было интересно, считаете ли вы, что чтение всего файла в поисках n символа будет быстрее, чем выполнение readLines (как предложил сарнольд)?

4. Этот метод имеет накладные расходы. br.readLine создает строку в качестве возвращаемого значения. А строки неизменяемы, поэтому всегда создается новый массив символов. И, конечно, выполняется кодировка символов. Этого можно избежать, используя решение sarnold. (только один массив буферов и вообще никакой кодировки)

Ответ №2:

Преимущество полученного вами алгоритма оценки в том, что он очень быстр: один stat(2) вызов, а затем некоторое деление. Это займет одинаковое количество времени и памяти, независимо от того, насколько велик или мал файл. Но это также совершенно неверно для огромного количества входных данных.

Вероятно, лучший способ получить конкретное число — фактически прочитать весь файл в поисках 'n' символов. Если вы читаете файл большими двоичными блоками (например, 16384 байта или в большей степени двойки) и ищете конкретный интересующий вас байт, это может привести к чему-то, приближающемуся к пропускной способности дискового ввода-вывода.

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

1. Вы хотите сказать, что по сравнению с решением, предложенным Джонатоном, быстрее читать весь файл в поисках n символов

2. Мы с Джонатаном дали очень похожие ответы — за исключением того, что он разрешает библиотекам Java выполнять всю буферизацию и поиск 'n' за вас, что является отличной идеей.

Ответ №3:

Вам нужно использовать BufferedReader и counter , которые увеличивают значение 1 для каждой readLine().