Это приводит к ненужным действиям сканирования.
Я предполагаю, что вы имеете в виду накладные расходы на поиск какой-либо точки, а затем находите следующую допустимую начальную позицию строки CSV, читая, пока не нажмете следующую новую строку.
я могу думать о трех способов сделать это, что может быть более эффективным, чем то, что вы сейчас делаете:
Читать весь файл и разобрать строки в форварды направлении, сохраняя свои позиции в памяти , Затем обрабатывайте строки в памяти в обратном порядке.
Сканирование файла с начала поиска начала строки и сохранение начальных позиций строки в памяти. Затем перебирайте позиции в обратном порядке, пытаясь каждому прочитать строку. (Вы можете сделать ввод более эффективно, обрабатывая несколько строк в каждом поиске.)
Составьте файл в память с помощью MappedByteBuffer
, затем вы можете пройти через буфер байтов вперед или назад, чтобы найти границы строк.
Первый подход требует, чтобы вы буфер весь файл в памяти, но имеет более низкие накладные расходы I/O, потому что вы читаете файл только один раз с минимальным количеством системных вызовов. Третий подход имеет ту же самую проблему, хотя вы можете сопоставить чрезвычайно большой файл в памяти в больших (больших) разделах, чтобы уменьшить требования к памяти.
Но, в конечном счете, нет простого и эффективного способа чтения файла на Java.