2010-02-11 16 views
12

Je voulais obtenir quelques conseils, j'ai commencé un nouveau projet pour créer un accélérateur de téléchargement Java qui utilisera plusieurs connexions. Je voulais savoir comment faire à ce sujet. Jusqu'à présent, j'ai compris que je pouvais utiliser HttpUrlConnection et utiliser la propriété range, mais je voulais savoir comment y parvenir. Une fois que j'ai téléchargé les parties des connexions multiples, je devrai alors joindre les parties pour que nous nous retrouvions avec un fichier entièrement téléchargé.Java connexion multiple téléchargement

Merci à l'avance :)

+1

Votre question n'est pas très claire ou spécifique. Pourriez-vous éventuellement préciser. Merci –

+0

@ tous: ** Les questions ont besoin de votes aussi! ** –

Répondre

10
  1. Obtenez la longueur du contenu du fichier à télécharger.
  2. Diviser selon un critère (taille, vitesse, & hellip;).
  3. exécuter plusieurs threads pour télécharger le fichier à partir de différentes positions,
    et de les enregistrer dans des fichiers différents: myfile.part1,   myfile.part2, & hellip;
  4. Une fois téléchargé, joignez les pièces dans un seul fichier.

J'ai essayé le code suivant pour obtenir la longueur du contenu:

public Downloader(String path) throws IOException { 
    int len = 0; 
    URL url = new URL(path); 
    URLConnection connectUrl = url.openConnection(); 
    System.out.println(len = connectUrl.getContentLength()); 
    System.out.println(connectUrl.getContentType()); 

    InputStream input = connectUrl.getInputStream(); 
    int i = len; 
    int c = 0; 
    System.out.println("=== Content ==="); 
    while (((c = input.read()) != -1) && (--i > 0)) { 
     System.out.print((char) c); 
    } 
    input.close(); 
} 

Voici un exemple de code pour rejoindre les fichiers:

public void join(String FilePath) { 
    long leninfile=0, leng=0; 
    int count=1, data=0; 
    try { 
     File filename = new File(FilePath); 
     RandomAccessFile outfile = new RandomAccessFile(filename,"rw"); 
     while(true) { 
      filename = new File(FilePath + count + ".sp"); 
      if (filename.exists()) { 
       RandomAccessFile infile = new RandomAccessFile(filename,"r"); 
       data=infile.read(); 
       while(data != -1) { 
        outfile.write(data); 
        data=infile.read(); 
       } 
       leng++; 
       infile.close(); 
       count++; 
      } else break; 
     } 
     outfile.close(); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 
} 
+1

merci Shaaf je pense que c'est ce que je cherchais, je vais lui donner un bash :) –

2

JDownloader est le meilleur téléchargeur que je l'ai vu. Si vous êtes intéressé, c'est open source et vous pouvez sûrement apprendre beaucoup de leur code.

+0

sonne bien, laissez-moi jeter un coup d'oeil –

+0

'... sûrement vous pouvez apprendre beaucoup de leur code ...' pas _only_ que, vous pouvez même ** modifier ** ou ** l'utiliser ** sur votre propre programme. (c'est open-source!) –

7

Si vous voulez éviter de rejoindre les segments après avoir téléchargement pourrait utiliser un FileChannel. Avec FileChannel, vous pouvez écrire à n'importe quelle position d'un fichier (même avec plusieurs threads).

Ainsi, vous pouvez d'abord allouer le fichier entier, puis
écrire les segments où ils appartiennent comme ils viennent dans.

Voir le Javadocs page pour plus d'informations.

+1

+1: Je pense que 'FileChannel' est le moyen le plus efficace/facile à faire. –