Olá,
Alguem poderia me ajudar, porque eu estou querendo fazer um programa que o usuário final poderia digitar uma URL para um arquivo tipo: “http://www.site.com.br/java/File.zip”. Lembrando que eu sou meio que iniciante.
Olá nathanpc. Vou apresentar um método pronto (bem simples) que você pode utilizar para gravar arquivos a partir de uma URL.
publicstaticFilegravaArquivoDeURL(StringstringUrl,StringpathLocal){try{//Encapsula a URL num objeto java.net.URLURLurl=newURL(stringUrl);//Queremos o arquivo local com o mesmo nome descrito na URL//Lembrando que o URL.getPath() ira retornar a estrutura //completa de diretorios e voce deve tratar esta String//caso nao deseje preservar esta estrutura no seu disco local.StringnomeArquivoLocal=url.getPath();//Cria streams de leitura (este metodo ja faz a conexao)...InputStreamis=url.openStream();//... e de escrita.FileOutputStreamfos=newFileOutputStream(pathLocal+nomeArquivoLocal);//Le e grava byte a byte. Voce pode (e deve) usar buffers para//melhor performance (BufferedReader).intumByte=0;while((umByte=is.read())!=-1){fos.write(umByte);}//Nao se esqueca de sempre fechar as streams apos seu uso!is.close();fos.close();//apos criar o arquivo fisico, retorna referencia para o mesmoreturnnewFile(pathLocal+nomeArquivoLocal);}catch(Exceptione){//Lembre-se de tratar bem suas excecoes, ou elas tambem lhe tratarão mal!//Aqui so vamos mostrar o stack no stderr.e.printStackTrace();}returnnull;}
Espero que tenha ajudado. Isto não é exatamente java avançado, e algumas buscas no Google poderiam ter lhe ajudado bastante, pois vários sites oferecem snippets prontos com várias maneiras de executar tarefas corriqueiras como esta.
Veja a descrição das classes e métodos utilizados neste exemplo na especificação da API do Java, e você irá entender exatamente o que o programa faz. Lembre-se que a melhor maneira de aprender é experimentando!
–mcbrain
nathanpc
Olá mcbrain,
Obrigado pelo código, eu o compilo e dá tudo certo, mas quando eu vou executar o arquivo class, ele me volta esse erro:
Obrigado,
Nathan Paulino Campos
M
mcbrain
nathanpc:
Olá mcbrain,
Obrigado pelo código, eu o compilo e dá tudo certo, mas quando eu vou executar o arquivo class, ele me volta esse erro:
Obrigado,
Nathan Paulino Campos
Ah, Nathan, já deu pra ver que você é novo no Java mesmo!
Para que um arquivo java compilado possa ser executado, ele precisa de um ponto de entrada, o método “main()”.
Coloque o seguinte método antes ou depois do método estático gravaArquivoDeURL() na classe que você está usando, recompile e execute.
Este exemplo irá gravar a página de índice do Google na raiz do seu PC. Pra não perder a viagem, dê uma olhada nos tutoriais da Sun sobre o Java. Uma vez que você domine os conceitos básicos, vai ficar muito mais fácil criar seus próprios programas. Abraços!
– mcbrain
nathanpc
Muito Obrigado mcbrain, mas sem querer ser muito pidão você poderia me dizer se da para que o usuário digitase a URL para o arquivo, só para melhorar o programa e já saber para mais tarde se eu precisar.
Mas Muito Muito Obrigado,
Nathan Paulino Campos
M
mcbrain
A forma mais simples é passar a URL como argumento do programa, e já que vamos fazer isso, também passar o path de destino da gravação.
Seu método main, portanto, deverá aceitar 2 argumentos. Veja que ele tem apenas um parâmetro: um array de Strings chamado args. Isto é fixado pela especificação da linguagem Java. A JVM irá encaspular cada argumento da chamada do programa em uma String do parâmetro args, que podem ser referenciados e manipulados dentro do programa. Para usar vários argumentos na chamada do programa, separe-os por um espaço.
Desculpe minha ignorancia, estou a horas tentando fazer com o Buffered mas não esta indo de jeito nenhum!
Alguem poderia me dar uma ideia de como seria?
Obrigado.
#Edit
Se não fosse pedir muito, como eu pego o nome do arquivo que esta vindo pelo InputStream? Thanks!
M
mcbrain
Neri J?ior:
Desculpe minha ignorancia, estou a horas tentando fazer com o Buffered mas não esta indo de jeito nenhum!
Alguem poderia me dar uma ideia de como seria?
Obrigado.
#Edit
Se não fosse pedir muito, como eu pego o nome do arquivo que esta vindo pelo InputStream? Thanks!
Um dos construtores do BufferedWriter recebe um Writer, e um int com o tamanho do buffer como argumentos. Se você estiver escrevendo em um arquivo, pode usar um FileWriter, que por sua vez pode receber um objeto File como argumento no construtor:
Depois é só usar o método write() do BufferedWriter e sucesso.
Edit: gramática.
N
Neri_J_ior
Muito Obrigado!
S
saint_muniz
Olá a todos, estou precisando de uma ajuda.
Estou utilizando a seguinte classe para fazer o download de um arquivo via FTP:
TesteDownloadArquivoExcel
packagetestemain;importjava.io.BufferedInputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.net.MalformedURLException;importjava.net.URL;importjava.net.URLConnection;importjava.util.logging.Level;importjava.util.logging.Logger;publicclassTesteDownloadArqExcel{publicstaticvoidmain(String[]args){if(downloadArquivoExcel()){System.out.println("Download concluído com sucesso");}else{System.out.println("Download não concluído");}}privatestaticbooleandownloadArquivoExcel(){InputStreamis=null;BufferedInputStreambuf=null;FileOutputStreamout=null;booleanok=false;try{URLurl=newURL("ftp://User_Name:password@host_ftp/Nome_do_arquivo.xls");url.getHost();url.getFile();url.getPort();url.getUserInfo();URLConnectioncon=url.openConnection();buf=newBufferedInputStream(con.getInputStream());out=newFileOutputStream("c:\\excelDown.xls");inti=0;byte[]bytesIn=newbyte[1024];while((i=buf.read(bytesIn))>=0){out.write(bytesIn,0,i);}ok=true;}catch(MalformedURLExceptionex){Logger.getLogger(TesteDownloadArqExcel.class.getName()).log(Level.SEVERE,null,ex);}catch(IOExceptionioe){Logger.getLogger(TesteDownloadArqExcel.class.getName()).log(Level.SEVERE,null,ioe);}finally{try{if(buf!=null){buf.close();}if(out!=null){out.close();}}catch(IOExceptionex){Logger.getLogger(TesteDownloadArqExcel.class.getName()).log(Level.SEVERE,null,ex);}}if(ok){returnok;}returnfalse;}}
Ao executar o metodo “con.getInputStream()” estou recebendo uma Exception: “java.net.SocketException: Connection reset”
Alguém poderia me dizer o que estou fazendo de errado?
Desde já grato pela atenção.
M
marcobiscaro2112
FTP é um protocolo. Para que você baixe o arquivo você precisa fazer a requisição (assim como em HTTP, quando você faz um GET ou um POST).
Não basta tentar baixar diretamente. A Apache tem uma API para trabalhar com FTP, talvez seja melhor procurar sobre ela.
S
saint_muniz
Ainda estou tendo problemas, dei uma olhada na documentação “org.apache.commons.net.ftp.FTPClient”, mas ainda está ocorrendo a SocketException.
Modifiquei o codigo do método da classe.
privatestaticbooleandownloadArquivoExcel(){BufferedInputStreambuf=null;FileOutputStreamout=null;FTPClientftpCliente=newFTPClient();booleanok=false;try{ftpCliente.connect("ftp.nome_servidor.com");//Verifica se a conectouif(FTPReply.isPositiveCompletion(ftpCliente.getReplyCode())){ftpCliente.login("UserName","Password");ftpCliente.setFileType(FTPClient.STREAM_TRANSFER_MODE);//Desativa a verificação de HOSTftpCliente.setRemoteVerificationEnabled(false);out=newFileOutputStream("c:\\excelDown.xls");buf=newBufferedInputStream(ftpCliente.retrieveFileStream("/excelDown.xls"));//Verifica se download completouif(ftpCliente.completePendingCommand()){inti=0;byte[]bytesIn=newbyte[1024];while((i=buf.read(bytesIn))>=0){out.write(bytesIn,0,i);}ok=true;}}else{ftpCliente.disconnect();Logger.getLogger(TesteDownloadArqExcel.class.getName()).log(Level.SEVERE,"Não foi possível conectar no servidor FTP para atualização da base estática.");}}catch(IOExceptionioe){Logger.getLogger(TesteDownloadArqExcel.class.getName()).log(Level.SEVERE,null,ioe);}finally{try{if(ftpCliente!=null){ftpCliente.disconnect();}if(buf!=null){buf.close();}if(out!=null){out.close();}}catch(IOExceptionex){Logger.getLogger(TesteDownloadArqExcel.class.getName()).log(Level.SEVERE,null,ex);}}if(ok){returnok;}returnfalse;}}
O método de verifcação de HOST já ativei e desativei e continua o problema.
Alguém poderia me ajudar com esse código?
Por favor…
M
marcobiscaro2112
3 coisas:
Você tem certeza que o servidor está OK? Você consegue resgatar esse arquivo se você abrir a linha de comando e se conectar ao servidor?
Em que linha exatamente está ocorrendo a exceção?
O FTPClient já está em modo passivo por padrão? Se não estiver, deve estar.
S
saint_muniz
marcobiscaro2112:
3 coisas:
Você tem certeza que o servidor está OK? Você consegue resgatar esse arquivo se você abrir a linha de comando e se conectar ao servidor?
Em que linha exatamente está ocorrendo a exceção?
O FTPClient já está em modo passivo por padrão? Se não estiver, deve estar.
Resposta:
1 - A linha do código de demonstração verifica se conectou corretamente. Em debug verifiquei se estava conectando corretamente. Tudo OK.
2 - Na linha 22 está ocorrendo SocketException.
3 - Sim está por default.
Usei uma solução um tanto quanto grosseira.
Como meu servidor de aplicativo fica em LINUX, usei o Runtime.getRuntime().exec(“Comando a ser executado”), usando o wget passando a url de conexão com o FTP.
Funcionou mas tive de criar um método para ler o arquivo excel, sendo que tive de temporizar para dar tempo do download ser concluido.
Mas fica o meu problema porque eu acho que isso não é um funcionamento normal.
M
marcobiscaro2112
Isso não é normal mesmo. Coloque aqui o stacktrace completo da exceção e certifique-se que é preciso colocar a barra no início do caminho mesmo (ou se ela pode ser omitida). Além disso, tente realizar outras operações, como listar arquivos (vide documentação: http://commons.apache.org/net/api/org/apache/commons/net/ftp/FTPClient.html) e nos diga o resultado.