Вам необходим CountingOutputStream (как видно на Commons IO: http://commons.apache.org/io/api-release/index.html).. Вы создаете один из них, оборачиваете в него целевой объект OutputStream, а затем можете проверить ByteCount по требованию, чтобы отслеживать ход загрузки.
РЕДАКТИРОВАТЬ: вы бы сделали что-то вроде этого:
int size;
String remote, local;
// do some work to initialize size, remote and local file path
// before saving remoteSource to local
OutputStream output = new FileOutputStream(local);
CountingOutputStream cos = new CountingOutputStream(output){
protected void beforeWrite(int n){
super.beforeWrite(n);
System.err.println("Downloaded "+getCount() + "/" + size);
}
};
ftp.retrieveFile(remote, cos);
output.close();
Если ваша программа многопоточная, вы можете отслеживать прогресс, используя отдельный поток (например, для программы с графическим интерфейсом),но это все детали приложения.