Мне нужно скопировать большие файлы (ГБ) в другой файл (контейнер), и меня интересует производительность и использование оперативной памяти.
Чтение всего исходного файла, как показано ниже:
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 Я наконец нашел решение: IЯ могу использовать 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();
}
}
}