Я пытаюсь написать пакетный загрузчик для изображений. Получить InputStream из URLConnection
достаточно просто, но загрузка всех файлов занимает некоторое время. Использование многопоточности, безусловно, ускоряет его, но загрузка потоков может занять много памяти. Вот что я нашел:
Пусть in
будет InputStream
, file
целью File
и fos
a FileOutputStream
до file
Простой способ
fos.write(in.readAllBytes());
Прочитать весь файл, написать возвращаемый byte[]
. Вероятно, пригодится для получения исходного кода сайта, не годится для больших файлов, таких как изображения.
Запись фрагментов
byte[] buffer = new byte[bufsize];
int read;
while ((read = in.read(buffer, 0, bufsize)) >= 0) {
fos.write(buffer, 0, read);
}
Мне кажется, лучше.
in.transferTo (fos)
in.transferTo(fos);
Внутренняя запись фрагментов, как показано выше.
Files.copy ()
Files.copy(in, file.toPath(), StandardCopyOption.REPLACE_EXISTING);
Появляется использование собственных реализаций.
Какой из них следует использовать, чтобы минимизировать использование памяти, когда выполняются десятки раз параллельно?
Это небольшой забавный проект, внешние библиотеки для этого IMO излишни. Также я не могу использовать ImageIO
, так как он не может обрабатывать webms, некоторые pngs / jpgs и анимированные GIF-файлы.
EDIT:
Этот вопрос был основан на предположении, что одновременная запись возможна. Тем не менее, это не так. Я, вероятно, получу ссылки на изображения одновременно, а затем буду загружать их одну за другой. В любом случае, спасибо за ответы!