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 № 1Seu 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.