Подсчет байтов, потребляемых потоками char

133
16

У меня есть большой текстовый файл (csv) на диске, который я разделяю на строки. Что-то вроде этого:

BufferedReader reader = new BufferedReader(new FileReader(file));
while ((line = reader .readLine()) != null) {
...
}

То, что я хочу сделать, это вычислить смещение от начала файла для каждых 1000 строк, так что если в будущем я хочу прочитать 10 001-я строка, я могу перейти прямо к офсету X, а затем начать итерацию.

Файл может быть закодирован каким-либо образом, поэтому нет сильной связи между байтами и символами.

Кто-нибудь знает о каких-либо "учетных читателях" или альтернативном подходе? Я очень рад самому реализовать Reader, но не хочу писать очень сложный класс, если я могу его избежать.

спросил(а) 2021-01-25T17:44:15+03:00 4 месяца, 4 недели назад
1
Решение
63

Когда вам нужен произвольный доступ, BufferedReader не подходит. Вместо этого вам нужно изучить Channel и его подклассы, такие как FileChannel и т.д.

Простой пример чтения с использованием канала:

    RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw");
FileChannel inChannel = aFile.getChannel();

ByteBuffer buf = ByteBuffer.allocate(48);

int bytesRead = inChannel.read(buf);
while (bytesRead != -1) {

System.out.println("Read " + bytesRead);
buf.flip();

while(buf.hasRemaining()){
System.out.print((char) buf.get());
}

buf.clear();
bytesRead = inChannel.read(buf);
}
aFile.close();

Источник: http://tutorials.jenkov.com/java-nio/channels.html

Что касается вашего вопроса о чтении с того места, где вы остановились, FileChannel определяет метод read(ByteBuffer buf,int position) где position - позиция в байтах, где yu хочет прочитать.

ответил(а) 2021-01-25T17:44:15+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема