URL java Download muito lento [RESOLVIDO]

5 respostas
L

Boa noite, estou usando a URL para fazer downloads de arquivos, mas tá muito lento pra baixar o arquivo, tenho GVT 15 MB e a taxa de download tá dando +- 95 Kbps.
Chega a demorar uns 3 minutos pra baixar um arquivo de 13 MB, alguma idéia? segue código abaixo

public static boolean download(String linkDownload, String pathLocal) {
        
        try {
            URL url = new URL(linkDownload);
            String nomeArquivo = url.getPath();
            InputStream is = url.openStream();
            FileOutputStream fos = new FileOutputStream(pathLocal + nomeArquivo);
            int contByte = 0;
            long tempoInicio = System.currentTimeMillis();
            while ((contByte = is.read()) != -1) {
                fos.write(contByte);
            }
            long tempoFim = System.currentTimeMillis();
            //calcula a taxa de download
            long tempoDownload = ((tempoFim - tempoInicio) / 1000);
            is.close();
            fos.close();
            File arquivoSalvo = new File(pathLocal + nomeArquivo);
            System.out.println("Tamanho do arquivo baixado: " + arquivoSalvo.length()/1024 + " Kb");
            System.out.println("Tempo de downlod: " + tempoDownload + " segundos");
            System.out.println("Taxa de download: " + (arquivoSalvo.length()/1024) / tempoDownload + " Kbps" ) ;
            return true;
        }catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

Valeu.

5 Respostas

E
while ((contByte = is.read()) != -1) {  
                fos.write(contByte);  
            }

Amigo, não leia 1 byte de cada vez. O correto é ler um buffer de pelo menos 8KB de cada vez. Como se faz isso?

http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#read(byte[])

Não se esqueça de pegar o retorno do método “read” para ver quantos bytes foram efetivamente lidos (não se esqueça que pode ser que menos de 8 KB estejam disponíveis nessa hora).

L

Valeu pela dica alterei o while ficando:

byte buffer[] = new byte[8192]; long tempoInicio = System.currentTimeMillis(); while ((contByte = is.read(buffer)) >= 0) { fos.write(buffer, 0, contByte); }

Agora tá os bixoooooo, ta vindo a 1 Mbps o download. Testei com vários tamanhos, 128, 512, 1024, 2046, 4096, 8192, todos sempre com a mesma taxa de download de 1 Mbps. Isso não entendi muito bem como funciona. Queria que viesse a 1,6 Mbps. :slight_smile:

E

Depende de onde você está fazendo o download :slight_smile:

E

Use uma ferramenta como o SpeedTest.net para ver qual é a taxa que realmente as coisas estão vindo. Teoricamente, 15 MBPs deveria dar por volta de 1,6 MB/s (levando em conta todos os overheads). Entretanto, pode ser que haja alguma limitação em algum ponto.

L

Sim, eu sei que depende de onde estou fazendo o download, gostaria de entender mais sobre o tamanho do buffer a ser lido :-).
No speed test deu 15 MB de down e 1 MB de up. Usando o downltheamall do firefox consigo fazer downlad a 1,6 e 1,7 Mbps

Criado 12 de dezembro de 2012
Ultima resposta 15 de dez. de 2012
Respostas 5
Participantes 2