增量读取大文件的最快方法
当给定一个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在与NIO相同的操作方面速度快了约100倍。我错过了什么吗?这是意料之中的吗?有没有一种更快的方法来读取缓冲区块中的文件?
最终,我正在处理一个大文件,我没有内存来一次读取所有内容。相反,我想在块中增量读取它,然后将其用于处理。