2011-11-21 9 views
1

Possible en double:
Android:“Unexpected end of stream” exception downloading large fileserreur de fin de flux lors du téléchargement de fichier?

Je télécharge un fichier avec le code suivant ci-dessous. Le fichier est approx. 5MB en taille. Cependant, je reçois une erreur java.io.IOException "fin inattendue de flux" lorsque le téléchargement est d'environ 60-90%

Je ne comprends pas comment le résoudre et ça me rend fou.

EDIT: Est-ce que quelqu'un peut au moins simplement le tester, s'il télécharge un fichier avec succès sur votre téléphone. Cela me permettra de déterminer si le problème est mon téléphone ou le code.

try { 
    URL url = new URL(full_url); 
    conexion = (URLConnection)url.openConnection(); 

    conexion.setReadTimeout(20000); 
    conexion.connect(); 
    File file = new File(root.getAbsolutePath()+"/", fileName); 

    int lenghtOfFile = conexion.getContentLength(); 
    System.out.println("content-length-header is: " + lenghtOfFile); 
    InputStream input = conexion.getInputStream(); 

    OutputStream output = new FileOutputStream(file); 

    byte data[] = new byte[8192]; 
    long total = 0; 
    contentView.setTextViewText(R.id.status_text,"Downloading file " + (78 - GlobalData.missingFiles.size()) + " of " + 77); 
    int downloadProgress = (int)((total*100)/lenghtOfFile); 

    int lastProgressUpdate=0; 

    while ((count = input.read(data)) != -1) { 
     System.out.println("available bytes:" + input.available()); 
     total += count; 

     downloadProgress = (int)((total*100)/lenghtOfFile); 
     Log.e("totaltotal","" + (int)((total*100)/lenghtOfFile)); 

     output.write(data,0,count); 
     if(downloadProgress%20==0 && downloadProgress != lastProgressUpdate) { 
      notification.contentView.setProgressBar(R.id.status_progress, 100,downloadProgress, false); 
      notificationManager.notify(1,notification); 
      lastProgressUpdate=downloadProgress;  
     } 
     if(downloadProgress == 100){ 
      GlobalData.downloadFiles.add("" +fileName); 
      GlobalData.missingFiles.remove(fileName); 
     } 
    } 

    output.flush(); 
    output.close(); 
    input.close(); 

    if(downloadProgress != 100){ 
     File temp_file = new File(root.getAbsolutePath()+"/", fileName); 
     try{ 
      if(temp_file.exists()){ 
       boolean del_main = temp_file.delete(); 
       Log.e("File","Does file exists: " + del_main); 
       Log.e("FilePath","PATH: " + temp_file.getAbsolutePath()); 
      }else{ 
       Log.e("File Exists NOT","NOT EXISTING"); 
      } 
     }catch(Exception e){ 
      Log.e("FileDelete","deleting is giving problems"); 
     } 
    } 
} catch (Exception e) { 
    Log.e("PRINTSTACK","STACK:" + e.getMessage()); 
    e.printStackTrace(); 
    System.out.println("Downloading didn't work"); 

    killService(); 
} 
+0

À quoi pointe la racine? –

+0

points de la racine à un dossier dans la carte SD – bytebiscuit

Répondre

1

Pour certaines raisons, le flux d'entrée se ferme prématurément. Souvent, c'est parce qu'un flux d'entrée est lu plusieurs fois à la fois, mais je suppose que ce n'est pas le cas ici, même si pour une raison quelconque, vous avez une portée plus large que ce que nous voyons ici.

Vous dites conexion = (URLConnection)url.openConnection(); au lieu du URLConnection conexion = url.openConnection(); attendu. Assurez-vous que vous n'essayez pas d'extraire le flux d'entrée deux fois. La seule autre chose que je peux voir est bizarre quand je regarde, c'est que vous utilisez directement le flux d'entrée de conexion.getInputStream(). Essayez de l'envelopper dans un flux d'entrée mis en tampon en tant que tel:

InputStream input = new BufferedInputStream(connexion.getInputStream()); 
Questions connexes