Самый быстрый способ инкрементального чтения большого файла

Если задан буфер MAX_BUFFER_SIZE и файл, который намного превышает его, как можно:

  1. Прочитать файл блоками MAX_BUFFER_SIZE?
  2. Сделать это как можно быстрее

Я пробовал использовать NIO

    RandomAccessFile aFile = new RandomAccessFile(fileName, "r");
    FileChannel inChannel = aFile.getChannel();

    ByteBuffer buffer = ByteBuffer.allocate(CAPARICY);

    int bytesRead = inChannel.read(buffer);

    buffer.flip();

        while (buffer.hasRemaining()) {
            buffer.get();
        }

        buffer.clear();
        bytesRead = inChannel.read(buffer);

    aFile.close();

И обычный ввод-вывод

    InputStream in = new FileInputStream(fileName);

    long length = fileName.length();

    if (length > Integer.MAX_VALUE) {
        throw new IOException("File is too large!");
    }

    byte[] bytes = new byte[(int) length];

    int offset = 0;

    int numRead = 0;

    while (offset < bytes.length
            && (numRead = in.read(bytes, offset, bytes.length - offset)) >= 0) {
        offset += numRead;
    }

    if (offset < bytes.length) {
        throw new IOException("Could not completely read file " + fileName);
    }

    in.close();

. Оказывается, обычный ввод-вывод примерно в 100 раз быстрее, чем NIO . Я что-то упускаю? Ожидается ли это? Есть ли более быстрый способ прочитать файл в кусках буфера?

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

19
задан Peter Lawrey 10 April 2016 в 13:36
поделиться