Problemas para sair do loop Do While

Estou escrevendo esse código para baixar um arquivo no meu ftp e salvar em uma pasta no computador do cliente, o problema que não consigo fazer com que avance no código após finalizar o download.
Segue parte do código:

fos = new FileOutputStream(destFile);
byte[] buffer = new byte[1024];
int len = 0, totBytes = 0;
do{
    totBytes += len;
    fos.write(buffer, 0, len);
}while((len = is.read(buffer)) > 0);

Obrigado por enquanto.

Em princípio não vejo problema no seu laço, entretanto você poderia fazer dessa forma pra ele ser mais rápido:

fos = new FileOutputStream(destFile);
byte[] buffer = new byte[4096];
int totBytes = 0;
for (int read = -1; (read = is.read(buffer)) != -1;  fos.write(buffer, 0, read)) {
    totBytes += read;
}

O comportamento foi o mesmo, infelizmente ele conclui e simplesmente para e não sai do laço.
Eu imprimi a cada passo da execução. segue informações da saída e o código completo.

run:
Iniciando
Entrou dentro do Try
Verifica se o arquivo existe e deleta
Cria a conexão
Começa a baixar
1024
2048
3072

262632
263091

public static void baixar(String srcAddress, String userAgent, String destDir, String destFileName, boolean overwrite) throws Exception{
    InputStream is = null;
    FileOutputStream fos = null;
    System.out.println("Iniciando");
    try{
        System.out.println("Entrou dentro do Try");
        File destFile = new File(destDir, destFileName);
        if(overwrite && destFile.exists()){
            System.out.println("Verifica se o arquivo existe e deleta");
            boolean deleted = destFile.delete();
            if (!deleted){
                System.out.println("Se não deletar apresenta erro");
                throw new Exception(String.format("Arquivo %s não foi localizado!", destFile.getAbsolutePath()));
            }
        }
        URL url = new URL(srcAddress);
        URLConnection urlConnection = url.openConnection();
        System.out.println("Cria a conexão");
        if(userAgent != null){
            urlConnection.setRequestProperty("User-Agent", userAgent);
        }
        is = urlConnection.getInputStream();
        fos = new FileOutputStream(destFile);
        byte[] buffer = new byte[1024];
        int len = 0, totBytes = 0;
        System.out.println("Começa a baixar");
        for (int read = -1; (read = is.read(buffer)) != -1;  fos.write(buffer, 0, read)) {
            totBytes += read;
            System.out.println(totBytes);
        }
//        do{
//            totBytes += len;
//            fos.write(buffer, 0, len);
//        }while((len = is.read(buffer)) > 0);
        System.out.println("Download concluído!");
        System.out.println(String.format("Nome do Arquivo: %s - Tamanho: %,d", destFile.getAbsolutePath(), totBytes));
    }finally{
        try{
            if(is != null) is.close();
        }finally{
            if(fos != null) fos.close();
        }
    }
}

Por acaso ele está bloqueando no read?
Provavelmente caso você precisa definir um read time out na sua URLConnection

Seria assim?

urlConnection.setReadTimeout(5000);

Retornou o erro na sequencia.

Exception in thread “main” java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:170)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
at java.io.FilterInputStream.read(FilterInputStream.java:133)
at java.io.FilterInputStream.read(FilterInputStream.java:107)
at mega.atualizador.MegaAtualizador.baixar(MegaAtualizador.java:126)
at mega.atualizador.MegaAtualizador.main(MegaAtualizador.java:22)
C:\Users\Leandro Matos\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53: Java returned: 1
FALHA NA CONSTRUÇÃO (tempo total: 5 segundos)

Isso mesmo.
Isso significa que após 5 segundos o método read não conseguiu ler nenhum byte do seu InputStream.

Você pode aumentar o tempo ou pôr um try-catch.
Mas deveria tentar descobrir porque o seu servidor não responde…

Abaixo exemplo com try-catch

fos = new FileOutputStream(destFile);
byte[] buffer = new byte[4096];
int totBytes = 0;
try {
    for (int read = -1; (read = is.read(buffer)) != -1;  fos.write(buffer, 0, read)) {
        totBytes += read;
    }
} catch (SocketTimeoutException timeout) {
    System.out.println("Timeout!!!");
}