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:
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
publicstaticvoidbaixar(StringsrcAddress,StringuserAgent,StringdestDir,StringdestFileName,booleanoverwrite)throwsException{InputStreamis=null;FileOutputStreamfos=null;System.out.println("Iniciando");try{System.out.println("Entrou dentro do Try");FiledestFile=newFile(destDir,destFileName);if(overwrite&&destFile.exists()){System.out.println("Verifica se o arquivo existe e deleta");booleandeleted=destFile.delete();if(!deleted){System.out.println("Se não deletar apresenta erro");thrownewException(String.format("Arquivo %s não foi localizado!",destFile.getAbsolutePath()));}}URLurl=newURL(srcAddress);URLConnectionurlConnection=url.openConnection();System.out.println("Cria a conexão");if(userAgent!=null){urlConnection.setRequestProperty("User-Agent",userAgent);}is=urlConnection.getInputStream();fos=newFileOutputStream(destFile);byte[]buffer=newbyte[1024];intlen=0,totBytes=0;System.out.println("Começa a baixar");for(intread=-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();}}}
S
staroski
Por acaso ele está bloqueando no read?
Provavelmente caso você precisa definir um read time out na sua URLConnection
L
leandropm1
Seria assim?
urlConnection.setReadTimeout(5000);
Retornou o erro na sequencia.
Exception in thread “main” java.net.SocketTimeoutException: Read timed outat 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: 1FALHA NA CONSTRUÇÃO (tempo total: 5 segundos)
S
staroski
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…