скачать почтовый файл с помощью Java? - PullRequest
8 голосов
/ 17 апреля 2010

Я загружаю 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();
    }
}

Ответы [ 6 ]

3 голосов
/ 17 апреля 2010

Должно быть так:

while ((count = in.read(b)) >= 0)

in.read может вернуть 0.

2 голосов
/ 17 апреля 2010

Поставьте out.flush() сразу после раздела "while ((count = in.read(b)) > 0) {...}" и перед out.close().

0 голосов
/ 17 апреля 2010

Только почтовые файлы, а? Очень странно. Это с любого сервера или только с этого? Если вы переименуете файл (измените расширение), у вас возникнет та же проблема? Какие байты отсутствуют? Вы уверены, что это последние 2K байта, а не какой-то кусок из середины / и т.д ...

0 голосов
/ 17 апреля 2010

Несколько лет назад я помню, как столкнулся с проблемой со старой версией Tomcat (5.5.25 для памяти), которая приводила к обрезанию больших загрузок. Мы исправили это путем обновления до 5.5.27. Я также помню, что та же проблема была обнаружена и исправлена ​​в более раннем выпуске Tomcat 6.0.

Если это звонит вам в колокола, посмотрите журналы изменений Tomcat.

0 голосов
/ 17 апреля 2010

У меня была проблема с загрузкой zip-файлов из http, как только выяснилось, что мои загрузки включали заголовки http в их начале, но это делало мои файлы немного больше, а не меньше, поэтому у вас, вероятно, нет этой проблемы.

В качестве дополнительного примечания вы можете рассмотреть возможность использования Apache Commons Net для загрузки связанных приложений - это действительно здорово.

0 голосов
/ 17 апреля 2010

Попробуйте удалить строки:

conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestProperty("content-type", "binary/data");
...