Если задан буфер MAX_BUFFER_SIZE и файл, который намного превышает его, как это сделать:
- Прочитайте файл в блоках MAX_BUFFER_SIZE?
- Сделайте это как можно быстрее
Я попытался использовать 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();
И правильный IO
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();
Оказывается, что обычный IO примерно в 100 раз быстрее, делая то же самое, что и NIO. Я что-то упускаю? Ожидается ли это? Есть ли более быстрый способ прочитать файл в кусках буфера?
В конечном счете я работаю с большим файлом, у меня нет памяти, чтобы читать все сразу. Вместо этого я бы хотел прочитать его поэтапно в блоках, которые затем будут использоваться для обработки.