#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().