Копирование образа Java нормально на окнах, но изменено на Linux - PullRequest
4 голосов
/ 16 октября 2011

Я загружаю картинку с URL следующим способом:

private void download(String srcUrl, String destination) throws Throwable {
    File file = new File(destination);
    if (!file.exists()) {
        file.createNewFile();
        BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file));
        BufferedInputStream in = new BufferedInputStream(new URL(srcUrl).openStream());
        byte bytes[] = new byte[1024];
        while (0 <= in.read(bytes, 0, 1024)) {
            out.write(bytes);
        }
        out.close();
        in.close();
    }
}

На окнах полученное изображение является идеальной копией оригинала. Однако на моем сервере Debian изображение изменилось: нижняя правая область изображения размыта. Это происходит на каждом изображении и всегда находится в одной и той же области изображения.

Большое спасибо за любую помощь!

1 Ответ

5 голосов
/ 16 октября 2011

Я не знаю, почему результат отличается в разных системах, хотя код имеет недостатки, и я подозреваю, что он как-то связан с наблюдаемым поведением.

while (0 <= in.read(bytes, 0, 1024)) {
    out.write(bytes);
}

Должно быть:

int count;
while ((count = in.read(bytes, 0, 1024)) > 0) {
    out.write(bytes, 0, count);
}

В противном случае есть [высокий] шанс «мусора» в конце, который может объяснить размытость, в зависимости от программы, которая пытается просмотреть [поврежденный] файл изображения. (Размер массива, используемого в качестве буфера, не изменяется - следует записывать только столько данных, сколько было записано в него.)

Удачного кодирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...