Progresso ao salvar arquivo [Resolvido]

Olá,

Estou utilizando o seguinte código para fazer o download de uma imagem na internet e salva-la em meu computador:

[code]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”);
}
}
}[/code]

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.

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.

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

Segue a solução completa:

[code]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.");
  }

}
}[/code]

Até a próxima.

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

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