Я загружаю zip-файл с веб-сервера с помощью Java, но так или иначе я освобождаю приблизительно 2 КБ в каждом файле. Я не знаю, почему, так как тот же код хорошо работает с другими форматами, например, текст, mp3 и дополнительный. какая-либо справка ценится? вот мой код.
public void download_zip_file(String save_to) {
try {
URLConnection conn = this.url.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestProperty("content-type", "binary/data");
InputStream in = conn.getInputStream();
FileOutputStream out = new FileOutputStream(save_to + "tmp.zip");
byte[] b = new byte[1024];
int count;
while ((count = in.read(b)) > 0) {
out.write(b, 0, count);
}
out.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
Это должно быть следующим образом:
while ((count = in.read(b)) >= 0)
in.read
может вернуть 0
.
Однажды у меня возникла проблема с загрузкой zip-файлов с http, которая, как оказалось, заключалась в том, что мои загрузки включали заголовки http в начале, но из-за этого мои файлы становились немного больше, а не меньше, так что у вас, вероятно, нет этой проблемы.
В качестве примечания вы можете рассмотреть возможность использования Apache Commons Net для загрузки связанных приложений - это действительно здорово.
Несколько лет назад я помню, как столкнулся с проблемой старой версии Tomcat (5.5.25 для памяти), которая приводила к усечению больших загрузок. Мы исправили это, обновив до 5.5.27. Я также помню, что такая же проблема была обнаружена и исправлена в раннем выпуске Tomcat 6.0.
Если это вас задело, взгляните на журналы изменений Tomcat.
Только zip-файлы, да? Очень странно. Это с какого сервера или только с этого? Если вы переименуете файл (измените расширение), у вас возникнет такая же проблема? Какие байты отсутствуют? Вы уверены, что это последние 2 Кбайта, а не какой-то фрагмент из середины / и т. Д.?
Попробуйте удалить строки:
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestProperty("content-type", "binary/data");
Вставьте out.flush ()
сразу после раздела « while ((count = in.read (b))> 0) {...}
» и перед разделом out. close ()
.