Progresso ao salvar arquivo [Resolvido]

4 respostas
M

Olá,

Estou utilizando o seguinte código para fazer o download de uma imagem na internet e salva-la em meu computador:
import java.io.FileOutputStream;
import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;

public class ImageTest {
   public static void main(String[] args) {
      fazerDownload();
   }
   public static void fazerDownload() {
      try {
         URL img = new URL("http://www.google.com.br/images/logo_sm.gif");
         ReadableByteChannel rbc = Channels.newChannel(img.openStream());
         FileOutputStream fos = new FileOutputStream("c:/teste.gif");
         fos.getChannel().transferFrom(rbc, 0, 1 << 24);
         fos.close();
         System.out.println("Imagem salva\n");
      } catch (Exception e) {
         e.printStackTrace();
         System.out.println("Erro ao salvar arquivo.\n");
      }
   }
}

O programa funciona de modo satisfatório. Entretanto, gostaria de saber como verificar a porcentagem do arquivo que já foi baixada. Existe alguma forma de fazer isso com este código ou devo alterar o funcionamento desde o princípio?

Grato pela atenção.

4 Respostas

E

Você pode substituir a única chamada a:
fos.getChannel().transferFrom(rbc, 0, 1 << 24);

por várias chamadas a transferFrom, mas transferindo apenas 1KB de cada vez (acho que você é esperto e sabe que parâmetros você tem de passar). Então você vai mostrando o progresso (admitindo-se que você consiga achar o tamanho do dado a ser baixado.

M

OK, obrigado pela atenção e pela dica. Funcionou perfeitamente.

Segue a solução completa:
import java.io.FileOutputStream;
import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;

public class ImageTest {
   public static void main(String[] args) {
      fazerDownload();
   }
   public static void fazerDownload() {
      int tamanhoTotal;
      int position = 0;
      long transBytes;

      try {
         URL img = new URL("http://upload.wikimedia.org/wikipedia/commons/thumb/3/33/PortraitOfAnIguana.jpg/709px-PortraitOfAnIguana.jpg");
			
         tamanhoTotal = img.openConnection().getContentLength();
         System.out.println("Tamanho total: " + tamanhoTotal);

         ReadableByteChannel rbc = Channels.newChannel(img.openStream());
         FileOutputStream fos = new FileOutputStream("c:/709px-PortraitOfAnIguana.jpg");
         System.out.print("0%");
         while ((transBytes = fos.getChannel().transferFrom(rbc, position, 1 << 10)) != 0) {
            position += transBytes;
            System.out.print("\r" + (100 * position / tamanhoTotal) + "%");
         }
         fos.close();
         System.out.println("\nImagem salva");
      } catch (Exception e) {
         e.printStackTrace();
         System.out.println("Erro ao salvar arquivo.");
      }
   }
}

Até a próxima.

E

Só lembrando que 1KB é (1 << 10), não (1 << 3) (que é 8). OK?

M

Opa, esqueci que shift bit lida com bits e não com potencias de 10…
Já corrigido. Obrigado novamente.

Criado 23 de setembro de 2009
Ultima resposta 23 de set. de 2009
Respostas 4
Participantes 2