Мне нужно скопировать большие файлы (ГБ) в другой файл (контейнер), и меня интересует производительность и использование оперативной памяти.
Чтение всего исходного файла например:
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?
Лучше ли читать исходный файл побайтно, а не целиком?
Как мне поступить в таком случае?
Заранее спасибо.
РЕДАКТИРОВАТЬ:
После ответа Мехди Майка я наконец нашел решение:
Я могу использовать 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();
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/544 ... file-class