Java NIO / MappedByteBuffer и map, чтение части файла кусками - PullRequest
0 голосов
/ 11 июля 2011

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

   final FileInputStream fis = new FileInputStream(f);
    final FileChannel fc = fis.getChannel();
    final long sizeRead = fc.size() < defaultReadBufferSize ? fc.size() : defaultReadBufferSize;
    final MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, sizeRead);        
    while (bb.hasRemaining()) {                        
        final CharBuffer cb = decoder.decode(bb);
        this.search(f, cb);   
        System.out.println("============>" + cb.length());
        System.out.println("============>" + bb.hasRemaining());            
    }        
    fc.close();

1 Ответ

3 голосов
/ 11 июля 2011

Проблема в том, что данные, закодированные символами, не могут быть доступны таким образом.т.е. вам нужно знать, где находятся границы между символами.

Стоимость доступа к файлу и декодирования символов, вероятно, будет намного дороже, чем то, как вы его читаете, поэтому я бы использовал BufferedReader,гораздо проще.

например, скажем, вы хотите прочитать с 1000-го байта.Вы можете сделать это, но вы не будете знать, является ли 1000-й байт частью многобайтового символа или нет.

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

...