Мне нужно скопировать большие файлы (ГБ) в другой файл (контейнер), и мне было интересно узнать о производительности и использовании оперативной памяти.
Чтение всего исходного файла следующим образом:
RandomAccessFile f = new RandomAccessFile(origin, "r");
originalBytes = new byte[(int) f.length()];
f.readFully(originalBytes);
А позже скопируйте все в контейнер следующим образом:
RandomAccessFile f2 = new RandomAccessFile(dest, "wr");
f2.seek(offset);
f2.write(originalBytes, 0, (int) originalBytes.length);
все в памяти, верно? Таким образом, копирование больших файлов может повлиять на память и привести к исключению OutOfMemory?
Лучше ли читать байты исходного файла по байтам, а не целиком? В таком случае, как мне поступить? Заранее спасибо.
ИЗМЕНИТЬ:
Следуя ответу mehdi maick, я наконец нашел решение: я могу использовать RandomAccessFile в качестве пункта назначения, как я хотел, и поскольку RandomAccessFile имеет метод "getChannel", который возвращает FileChannel, я могу передать его следующему методу, который сделает копию (32 КБ за раз) файла в нужном мне месте назначения:
public static void copyFile(File sourceFile, FileChannel destination, int position) throws IOException {
FileChannel source = null;
try {
source = new FileInputStream(sourceFile).getChannel();
destination.position(position);
int currentPosition=0;
while (currentPosition < sourceFile.length())
currentPosition += source.transferTo(currentPosition, 32768, destination);
} finally {
if (source != null) {
source.close();
}
}
}
FileInputStream
иFileOutputStream
- person Andreas   schedule 01.02.2019RandomAccessFile
? Разве вы не просто объединяете существующие файлы в комбинированный файл? - person Andreas   schedule 01.02.2019