2010-10-11 5 views
3

Bonjour J'ai besoin d'aide pour télécharger un fichier depuis mon application Java.Télécharger le fichier depuis l'application java

L'URL est "& http://my.site.com/UICFEWebroot/QueryOneDateAllCur?lang=ita rate = 0 & initDay = 11 & & initMonth = 10 = 2010 initYear & & refCur = euro R1 = csv"

J'essayez d'utiliser ce code, mais le résultat est un fichier vide

URL urlAgg = new URL(address); 

int lf = urlAgg.openConnection().getContentLength(); 
FileOutputStream fos = new FileOutputStream("agg" + File.separator + "cambio" + gg + mm + aaaa + ".csv"); 
InputStream in = urlAgg.openStream(); 
for (int i = 0; i < lf; i++) 
    { 
    byte[] b = new byte[1]; 
    in.read(b); 
    fos.write(b); 
    } 

fos.close(); 
in.close(); 

Répondre

2

Vous pouvez changer pendant un certain temps la clause « pour ». Juste pour assurer le téléchargement si la longueur du contenu n'est pas correcte:

String urlTemp = "the URL"; 
File saveFile = new File("File to save path"); 
URL url = new URL(urlTemp); 
URLConnection connection = url.openConnection(); 
InputStream is = connection.getInputStream(); 
FileOutputStream fos = new FileOutputStream(saveFile); 


byte[] buffer = new byte[1024]; 
int read = 0; 
while ((read = is.read(buffer, 0, buffer.length)) >= 0) { 
    fos.write(buffer, 0, read); 
} 

fos.flush(); 
fos.close(); 
is.close(); 

De plus, essayer/attraper la section sera nécessaire. Si le fichier à la charge vers le bas est grande, vous devrez peut-être définir un temps plus sur l'objet de connexion:

connection .setConnectTimeout(timeoutonnect); 
connection .setReadTimeout(timeoutRead); 

Espérons que l'aide d'extrait!

+0

le fichier est très faible. Le problème que je pense est la chaîne d'adresse http://uif.bancaditalia.it/UICFEWebroot/QueryOneDateAllCur?lang=ita&rate=0&initDay=11&initMonth=10&initYear=2010&refCur=euro&R1=csv n'est pas un fichier mais un php ou une requête similaire – Giovanni

+0

le url n'est pas un problème, ce code va télécharger le contenu de l'URL en tant que flux. Le délai de connexion est également important si votre fichier n'est pas grand mais si le serveur ou la connexion sont lents – Fgblanch

+0

Aussi dans votre code vous téléchargez le fichier octet par octet et ce n'est pas vraiment efficace;) – Fgblanch

3

Cela a fonctionné pour moi:

package download; 

import java.io.*; 
import java.net.URL; 

/** 
* DownloadDemo 
* User: Michael 
* Date: Oct 11, 2010 
* Time: 10:19:34 AM 
*/ 
public class DownloadDemo 
{ 
    public static void main(String[] args) 
    { 
     StringBuilder contents = new StringBuilder(4096); 
     BufferedReader br = null; 

     try 
     { 
      String downloadSite = ((args.length > 0) ? args[0] : "http://www.google.com"); 
      String outputFile = ((args.length > 1) ? args[1] : "currencies.csv"); 
      URL url = new URL(downloadSite); 
      InputStream is = url.openConnection().getInputStream(); 
      br = new BufferedReader(new InputStreamReader(is)); 
      PrintStream ps = new PrintStream(new FileOutputStream(outputFile)); 
      String line; 
      String newline = System.getProperty("line.separator"); 
      while ((line = br.readLine()) != null) 
      { 
       contents.append(line).append(newline); 
      } 
      ps.println(contents.toString()); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
     finally 
     { 
      try { if (br != null) br.close(); } catch(IOException e) { e.printStackTrace(); } 
     } 
    } 
} 

Et voici une partie du résultat (trop gros pour tenir la chose):

C:\JDKs\jdk1.6.0_13\bin\java -Didea.launcher.port=7533 com.intellij.rt.execution.application.AppMain download.DownloadDemo http://uif.bancaditalia.it/UICFEWebroot/QueryOneDateAllCur?lang=ita&rate=0&initDay=11&initMonth=10&initYear=2010&refCur=euro&R1=csv 
Quotazioni in euro riferite al 11/10/2010""Paese,Valuta,Codice ISO,Codice UIC,Quotazione,Convenzione di cambio,Nota""AFGHANISTAN,Afghani,AFN,115,62.8792,Foreign currency amount for 1 Euro,CAMBI INDICATIVI CALCOLATI GIORNALMENTE DA BI SULLA BASE DELLE RILEVAZIONI DI MERCATOALBANIA,Lek,ALL,047,138.163,Foreign currency amount for 1 Euro,CAMBI INDICATIVI CALCOLATI GIORNALMENTE DA BI SULLA BASE DELLE RILEVAZIONI DI MERCATOALGERIA,Dinaro Algerino,DZD,106,103.035,Foreign currency amount for 1 Euro,CAMBI INDICATIVI CALCOLATI GIORNALMENTE DA BI SULLA BASE DELLE RILEVAZIONI DI MERCATOANGOLA,Readjustado Kwanza,AOA,087,128.395,Foreign currency amount for 1 Euro,CAMBI INDICATIVI CALCOLATI GIORNALMENTE DA BI SULLA BASE DELLE RILEVAZIONI DI MERCATOANTIGUA E BARBUDA,Dollaro Caraibi Est,XCD,137,3.76272,Foreign currency amount for 1 Euro,CAMBI INDICATIVI CALCOLATI GIORNALMENTE DA BI SULLA BASE DELLE RILEVAZIONI DI MERCATOANTILLE OLANDESI,Fiorino Antille Olandesi,ANG,132,2.48061,Foreign currency amount for 1 Euro,CAMBI INDICATIVI CALCOLATI GIORNALMENTE DA BI SULLA BASE DELLE RILEVAZIONI DI MERCATOARABIA SAUDITA,Riyal Saudita,SAR,075,5.22619,Foreign currency amount for 1 Euro,CAMBI INDICATIVI CALCOLATI GIORNALMENTE DA BI SULLA BASE DELLE RILEVAZIONI DI MERCATOARGENTINA,Peso Argentina,ARS,216,5.51578,Foreign currency amount for 1 EuroCAMBI INDICATIVI CALCOLATI GIORNALMENTE DA BI SULLA BASE DELLE RILEVAZIONI DI MERCATO 

Process finished with exit code 0 
+0

Ok mais si je veux enregistrer le fichier au format cvs pouvez-vous m'aider ?? – Giovanni

+0

Il semble que ce soit déjà au format CSV, sauf pour les retours à la ligne. Je les ai ajouté et écrit les résultats dans un fichier dans le code modifié. Nettoyez juste ce truc de premier plan et vous êtes bon. – duffymo

2

Je toujours utiliser une bibliothèque pour sauter ce code boilerplate . Ceci est un exemple avec commons/io:

final String url = "http://www.etc.etc"; 
final String fileName = "/foo/bar/baz.txt"; 

InputStream in = null; 
OutputStream out = null; 
try{ 
    in = new URL(url).openStream(); 
    final File f = new File(fileName); 
    final File par = f.getParentFile(); 
    if(!par.exists() && !par.mkdirs()){ 
     throw new IllegalStateException(
      "Couldn't create folder " + par); 
    } 
    out = FileUtils.openOutputStream(f); 
    IOUtils.copy(in, out); 
} catch(final IOException e){ 
    // handle exception 
} finally{ 
    IOUtils.closeQuietly(in); 
    IOUtils.closeQuietly(out); 
} 

Edit (duffymo): Voici le code sous une forme qui est en fait runnable:

Edit (seanizer): moved that to pastebin

+0

Si j'ajoute les éléments nécessaires à l'exécution de votre code (par exemple, les importations, une classe, une méthode principale, etc.), votre version se termine par 49 lignes de code Java; le mien n'a que 44. Mêmes styles pour les deux. Je dirais que le mien est plus court et que le vôtre a plus de dépendances. Je peux poster si vous le souhaitez. – duffymo

+0

@duffymo vraiment? sur ma machine c'est mon 35 (http://pastebin.com/d7wMEfG4) contre votre 45 (http://pastebin.com/rjecPgFC), les deux comprenant des lignes vides.Mais ce n'est pas mon propos: je préfère utiliser des méthodes descriptives de haut niveau où tout le monde voit immédiatement ce que le code fait, vous utilisez un code très efficace mais pas très communicatif. Oui: votre code fonctionne probablement mieux, mais le mien est plus lisible et plus facile à maintenir pour les développeurs inexpérimentés. Je dirais que les deux approches sont valides. –

+0

Ouais, comme je l'ai dit je peux poster. Je peux éditer votre réponse pour que vous puissiez voir. Il y a d'autres choses là-dedans, et j'ai tendance à avoir un style qui ne minimise pas les lignes, mais c'est similaire pour les deux. Je doute qu'il y ait une différence de performance: le téléchargement réseau submerge toutes les micro-optimisations que nous pourrions réaliser. Je suppose que le code de votre bibliothèque est plus performant. Et votre point est bien pris sur la lisibilité. J'étais juste curieux au sujet de votre réclamation "moins de lignes de code". Pas vrai, ce n'est pas le facteur décisif. – duffymo

Questions connexes