Я пытаюсь загрузить один файл с веб-сервера (http или https), используя как можно меньше сторонних библиотек.
Метод, который я придумал, следующий:
private static final int BUFFER_SIZE = 8;
public static boolean download(URL url, File f) throws IOException {
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
FileOutputStream out = new FileOutputStream(f);
BufferedInputStream in = new BufferedInputStream(conn.getInputStream());
byte[] buffer;
long dld = 0, expected = conn.getContentLengthLong(); // TODO expected will be -1 if the content length is unknown
while (true) { // TODO fix endless loop if server timeout
buffer = new byte[BUFFER_SIZE];
int n = in.read(buffer);
if (n == -1) break;
else dld += n;
out.write(buffer);
}
out.close();
System.out.println(dld + "B transmitted to " + f.getAbsolutePath());
return true;
}
Однако это ни в коем случае не работает так, как задумано. Я пытался загрузить https://upload.wikimedia.org/wikipedia/commons/6/6d/Rubber_Duck_Florentijn_Hofman_Hong_Kong_2013d.jpg, например, результат был ужасным:
По какой-то причине мне удалось просмотреть изображение в IrfanView, но не в каком-либо другом средстве просмотра, так что это восстановленная версия.
Я попытался изменить размер буфера или загрузить другие изображения, но результаты более или менее совпадают.
Если я посмотрю на файл, то все части содержимого будут просто заменены точками:
Я действительно потерян на этом, так что спасибо за любую помощь:)