2010-02-11 19 views
12

Quería obtener un consejo, comencé un nuevo proyecto para crear un acelerador de descarga de Java que utilizará varias conexiones. Quería saber cómo hacer esto mejor.Descarga de conexión múltiple de Java

Hasta ahora he descubierto que puedo usar HttpUrlConnection y usar la propiedad range, pero quería saber una forma eficiente de hacerlo. Una vez que haya descargado las partes de las conexiones múltiples, tendré que unir las partes para que terminemos con un archivo completamente descargado.

Gracias de antemano :)

+1

Su pregunta no es muy clara o específica. ¿Podría posiblemente aclarar? Gracias –

+0

@ all: ** ¡Las preguntas también necesitan votos! ** –

Respuesta

10
  1. Obtenga la longitud del contenido del archivo para descargar.
  2. Dividir según un criterio (tamaño, velocidad, & hellip;).
  3. ejecutar múltiples hilos para descargar el archivo a partir de las diferentes posiciones,
    y guardarlas en archivos diferentes: myfile.part1,   myfile.part2, y hellip;
  4. Una vez descargado, una las partes en un solo archivo.

He probado el siguiente código para obtener la longitud del contenido:

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(); 
} 

Aquí hay un código de ejemplo para unirse a los archivos:

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

gracias Shaaf, creo que es justo lo que estaba buscando, le dará un golpe :) –

2

JDownloader es el mejor programa de descarga que he visto. Si estás interesado, es de código abierto y seguramente puedes aprender mucho de su código.

+0

suena bien, déjame echarle un vistazo –

+0

'... seguramente puedes aprender mucho de su código ...' no solo eso, incluso puedes ** modificar ** o ** usar ** en su propio programa. (es de código abierto!) –

7

Si desea evitar unirse a segmentos después de la descarga se podría usar un FileChannel.
Con un FileChannel, puede escribir en cualquier posición de un archivo (incluso con varios hilos).

por lo que podría destinar primera todo el archivo, y luego
escribir los segmentos donde pertenecen ya que vienen en.

Consulte el Javadocs page para obtener más información.

+1

+1: Creo que 'FileChannel' es la forma más eficiente/fácil de hacer esto. –