Dúvida com buffer de download - JAVA

4 respostas
J

Ola é a primeira vez que participo de um tópico aqui ,isso porque estou realmente precisando de uma ajuda.
No código que montei abaixo estou tendo um problema com a var buffer que fará parte de byte[] bytes.Nesse caso quando deixo buffer como 16 ou mais,acaba dando um erro no arquivo final de download,o que não acontece quando a deixo como 8 ou menos.Gostaria de saber o porque disso estar ocorrendo.Desde já obrigado!

package appdownload;

import java.io.*;
import java.net.*;

public class AppDownload {

    public static void main(String[] args) {
        int downloaded = 0;
        int download = 0;
        String endereco = "http://www.longtailvideo.com/jw/upload/mediaplayer-viral.zip";

        try {
            URL url1 = new URL(endereco);
            System.out.println("*   Conectando...");
            URLConnection con = url1.openConnection();
            con.connect();
            System.out.println("*   Conectado à : " + url1.getProtocol() + "://" + url1.getHost() + "" + url1.getPath());
            FileOutputStream fileout = new FileOutputStream("c:/Johnny.zip");
            System.out.println("*   Baixando " + con.getContentLength() + " bytes");
            InputStream entrada = con.getInputStream();
            int buffer = 2048;
            byte[] bytes = new byte[buffer];
            while((download = entrada.read(bytes)) != -1) {
                downloaded += download;
                fileout.write(bytes);
                System.out.println("*   Downloaded: "+downloaded);
            }

            fileout.close();
            System.out.println("*   Arquivo baixado com sucesso!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

4 Respostas

ribclauport

Tem que postar qual erro esta acontecendo na pilha(console) copia o erro e cola aqui!

J

então,na verdade não ocorrem erros em tempo de execução,o erro acontece com o arquivo baixado.
No exemplo estou baixando um arquivo .zip.Quando coloco var buffer maior que 8 esse arquivo da erro de corrompimento quando aberto,e quando var buffer é 8 ou menor ele não dá erro de corrompimento ou algo do tipo.
A minha dúvida é : porque isso acontece?existe um limite de buffer?

E
while((download = entrada.read(bytes)) != -1) {  
                downloaded += download;  
                fileout.write(bytes);  
                System.out.println("*   Downloaded: "+downloaded);  
            }
Se o tamanho da entrada for 2050 (por exemplo), ele deve entrar nesse loop 3 vezes:

na primeira vez, ele  os primeiros 2048 bytes (então download vai receber 2048 )

na segunda vez, ele deve ler os últimos 2 bytes (então download vai receber 2)

e na terceira vez, como o arquivo  acabou, download vai receber -1.

O seu problema (de corrupção de dados - “corrompimento” é uma palavra que existe na língua portuguesa, mas só é usada em raros casos - acho que só advogados a usam, porque rima com “desfazimento”) deve-se ao fato que você fez o seu programa assim:

while((download = entrada.read(bytes)) != -1) {  
                downloaded += download;  
                fileout.write(bytes, 0, download);   // note que aqui escrevemos a quantidade EXATA de dados que foram lidos. 
                System.out.println("*   Downloaded: "+downloaded);  
            }

No exemplo que eu dei, em vez de você ter um arquivo de 2050 bytes, vai ter um arquivo de 4096 bytes, o que irá ocasionar o “corrompimento” (aham - corrupção) dos dados.

J

Desculpa cara,mas ainda não consegui entender,poderia explicar de outra forma?

Criado 4 de junho de 2012
Ultima resposta 5 de jun. de 2012
Respostas 4
Participantes 3