Мне нужно скопировать большие файлы (ГБ) в другой файл (контейнер), и меня интересует производительность и использование оперативной памяти.
Чтение всего исходного файла например:
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
Записывайте большие файлы, используя класс RandomAccessFile. ⇐ JAVA
Программисты JAVA общаются здесь
-
Anonymous
1719063476
Anonymous
Мне нужно скопировать большие файлы (ГБ) в другой файл (контейнер), и меня интересует производительность и использование оперативной памяти.
Чтение всего исходного файла например:
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?
Лучше ли читать исходный файл побайтно, а не целиком?
Как мне поступить в таком случае?
Заранее спасибо.
[b]РЕДАКТИРОВАТЬ:[/b]
После ответа [b]Мехди Майка[/b] я наконец нашел решение:
Я могу использовать 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();
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/54469628/write-big-files-using-randomaccessfile-class[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия