При потоковой передаче файла с сервера размер файла на диске больше, чем общее количество прочитанных байтов, что происходит? - PullRequest
0 голосов
/ 16 мая 2018

Я читаю двоичный файл из артефакта. Размер файла в соответствии с артефактом составляет 34 952 058 байт, счетчик totalBytes, который регистрируется после завершения чтения, также составляет 34 952 058 байт. Но размер файла на диске составляет 39 426 048 байт. В чем дело?? Я пробовал BufferedOutputStream, FileOutputStream и OutputStream. Это один и тот же результат каждый раз. Чего мне не хватает?
Вот как выглядит мой последний код на данный момент:

try {
                URL url = new URL(fw.getArtifactoryUrl());
                URLConnection connection = url.openConnection();
                in = connection.getInputStream();
                File folder = utils.getFirmwareFolder(null, FirmwareUtils.FIRMWARE_LATEST, true);
                StringBuilder builder = new StringBuilder(folder.toString());
                builder.append("/").append(fw.getFileName());
                Path filePath = Paths.get(builder.toString());
                OutputStream out = Files.newOutputStream(filePath);

                int read = 0;
                int totalBytes = 0;

                while ((read = in.read(bytes)) > 0) {
                    totalBytes += read;
                    out.write(bytes);
                    out.flush();
                }
                logger.info("Total bytes read: " + totalBytes);
                in.close();
                out.close();

<<< more code >>>

1 Ответ

0 голосов
/ 16 мая 2018

Ваш код читает правильно, но пишет неправильно

while ((read = in.read(bytes)) > 0) { // Read amount of bytes
    totalBytes += read;  // Add the correct amount of bytes read to total
    out.write(bytes);    // Write the whole array, no matter how much we read
    out.flush();         // Completely unnecessary, can harm performance
}

Вам нужно out.write(bytes, 0, read), чтобы записать только прочитанные байты вместо всего буфера.

...