/ / Ao transmitir um arquivo de um servidor, o tamanho do arquivo no disco é maior que o total de bytes lidos, o que está acontecendo? - java, file-io, inputstream, outputstream, fileoutputstream

Ao transmitir um arquivo de um servidor, o tamanho do arquivo no disco é maior do que o total de bytes lidos, o que está acontecendo? - java, file-io, inputstream, outputstream, fileoutputstream

Estou lendo um arquivo binário do artifactory. O tamanho do arquivo de acordo com o artifactory é 34.952.058 bytes, o totalBytes O contador registrado após a conclusão da leitura também é 34.952.058 bytes. Mas o tamanho do arquivo no disco é 39.426.048 bytes. O que está acontecendo? Eu tentei BufferedOutputStream, FileOutputStream e OutputStream. É o mesmo resultado todas as vezes. O que estou perdendo?
É assim que meu código mais recente se parece no momento:

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 >>>

Respostas:

3 para resposta № 1

Seu código lê corretamente, mas escreve incorretamente

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
}

Você precisa out.write(bytes, 0, read) para escrever apenas os bytes que você leu em vez do buffer inteiro.