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!!!");
}