Загрузки в программе Java иногда повреждаются

Я пытаюсь написать программу Java для резервного копирования каталога HTTP на удаленном сервере. Удаленный сервер находится через несколько VPN/брандмауэров/что-то еще, поэтому соединение не всегда самое лучшее.

Итак, я начинаю с загрузки списка корневого каталога и рекурсивно просматриваю записи. Это простая однопоточная программа.

Итак, моя проблема в том, что иногда HTML, который я получаю, поврежден. В основном он имеет несколько нулевых байтов по всему документу, которые я могу удалить с помощью replaceAll. Но с другой стороны, в нем, кажется, есть фрагменты текста два (или больше?) раза, поэтому вместо «Это текст, пожалуйста, прочитайте меня». я получаю что-то вроде "Это teis xt, пожалуйста, прочтите меня". Если вы вырежете дубликат «is is a», все будет в порядке. Обычно таких повторяющихся текстов несколько по всему документу.

Когда я просматриваю каталог с помощью браузера (а именно Firefox), у меня нет проблем, все выглядит нормально. Просто мой загрузчик продолжает получать поврежденные данные.

Итак, вот мой фрагмент кода, который получает данные листинга HTML:

        InputStream is = con.getInputStream();
        if ("gzip".equals(con.getContentEncoding())) {
            is = new GZIPInputStream(is);
        }
        int x = 0;
        byte[] data = new byte[1024];
        while ((x = is.read(data, 0, 1024)) >= 0) {
            if (x > 0) {
                retval += new String(data);
            }
        }

Любые идеи, что я делаю неправильно?

Привет!


person Julius    schedule 03.05.2013    source источник
comment
is.read прочитает 1024 байта в ваш массив, а это означает, что буфер может содержать старые данные. Взгляните на String(byte, int, int), что позволит вам указать диапазон байтов для построения строки   -  person MadProgrammer    schedule 03.05.2013
comment
ааааааа, я такая дура! большой фейспалм ... Конечно, это было причиной. Большое спасибо!   -  person Julius    schedule 03.05.2013


Ответы (1)


Замените на это:
retval += new String(data, 0, x);

Если вы прочитали меньше 1024 и 1024, которые вы прочитали ранее, вы получите x + (1024-x) данные, оставшиеся от предыдущего цикла.

person Cratylus    schedule 03.05.2013
comment
@MadProgrammer был немного быстрее, но да, действительно, это было причиной. И тебе спасибо! :) - person Julius; 03.05.2013
comment
@Julius Был на iPad, очень сложно написать полный ответ;) - person MadProgrammer; 03.05.2013