2012-04-11 37 views
2

我嘗試下載一個zip文件到android,然後解壓zip文件。我調試我的代碼,並有一個有趣的問題:下載的zip文件比原始文件大一點。並且下載的zip文件不能被winrar解壓縮。據說下載的文件以錯誤結束。 (。上我的網站的zip文件是好的,我嘗試用IE下載它工作正常) 以下是我的代碼:如何在android中正確地下載帶有java代碼的zip文件?

public void download(final String url, final String savePath, final String saveName) { 
    new Thread(new Runnable() { 
     public void run() { 
      try { 
       sendMessage(FILE_DOWNLOAD_CONNECT); 
       URL sourceUrl = new URL(url); 
       URLConnection conn = sourceUrl.openConnection(); 
       conn.connect(); 
       InputStream inputStream = conn.getInputStream(); 

       int fileSize = conn.getContentLength(); 

       File savefilepath = new File(savePath); 
       if (!savefilepath.exists()) { 
        savefilepath.mkdirs(); 
       } 
       File savefile = new File(savePath+saveName); 
       if (savefile.exists()) { 
        savefile.delete(); 
       } 
       savefile.createNewFile(); 

       FileOutputStream outputStream = new FileOutputStream(
        savePath+saveName, true); 

       byte[] buffer = new byte[1024]; 
       int readCount = 0; 
       int readNum = 0; 
       int prevPercent = 0; 
       while (readCount < fileSize && readNum != -1) { 
        readNum = inputStream.read(buffer); 
        if (readNum > -1) { 
         outputStream.write(buffer); 

         readCount = readCount + readNum; 

         int percent = (int) (readCount * 100/fileSize); 
         if (percent > prevPercent) { 
          sendMessage(FILE_DOWNLOAD_UPDATE, percent, 
           readCount); 

          prevPercent = percent; 
         } 
        } 
       } 
       outputStream.flush(); 
       outputStream.close(); 
       inputStream.close(); 
       //Thread.sleep(50); 
       sendMessage(FILE_DOWNLOAD_COMPLETE, savePath); 

      } catch (Exception e) { 
       sendMessage(FILE_DOWNLOAD_ERROR, e); 
      } 
     } 
    }).start(); 
} 

有人知道這個問題?

+0

我曾嘗試之前討論的解決方案:[鏈接](http://stackoverflow.com/questions/9324103/download-and-extract-zip-file-in-android)。但同樣的問題在那裏。 – David 2012-04-11 05:23:44

+0

另一個有趣的問題。下載後的文件大小會在我再次下載後發生變化(不是每次都是這樣)我想這可能是由android文件緩衝策略造成的。所以我嘗試//Thread.sleep(50);讓android完全保存文件。但它似乎不起作用。 (zip文件需要在下載後立即提取。) – David 2012-04-11 05:27:51

回答

5

當你讀入緩衝區,你正在寫的整個緩衝區輸出流:

outputStream.write(buffer); 

你應該只寫了心中緩衝區的部分:

outputStream.write(buffer, 0, readNum); 

特別對於網絡下載,不能保證對inputStream.read(buffer)的調用將填充緩衝區(即使文件中有超過1024個字節)。

+0

嗨,泰德。你是對的!它工作正常。我應該考慮一下。我很愚蠢。:) – David 2012-04-11 05:43:41

2
public class Download extends Activity { 
public static final int DIALOG_DOWNLOAD_PROGRESS = 0; 

private ProgressDialog mProgressDialog; 
    public String app_name ; 
    public String urlpath ; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 



app_name="test.rar";   
    urlpath = "https://www.abc.com/download/"+ app_name; 
    if (android.os.Environment.getExternalStorageState().equals 
      (android.os.Environment.MEDIA_MOUNTED)) 
    {   
     startDownload(); 
    } 

    else 
    { 
     Toast.makeText(getApplicationContext(), "SD Card not found,Insert SD card and try again", Toast.LENGTH_SHORT).show(); 
    } 

} 

private void startDownload() { 

    new DownloadFileAsync().execute(urlpath); 
} 
@Override 
protected Dialog onCreateDialog(int id) { 
    switch (id) { 
     case DIALOG_DOWNLOAD_PROGRESS: 
      mProgressDialog = new ProgressDialog(this); 
      mProgressDialog.setMessage("Downloading Updates.."); 
      mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
      mProgressDialog.setCancelable(false); 
      mProgressDialog.setIndeterminate(false); 
      mProgressDialog.setMax(100); 
      mProgressDialog.show(); 
      return mProgressDialog; 
     default: 
      return null; 
    } 
} 
class DownloadFileAsync extends AsyncTask<String, String, String> { 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     showDialog(DIALOG_DOWNLOAD_PROGRESS); 
    } 

    @Override 
    protected String doInBackground(String... aurl) { 


     try { 


      URL url = new URL(urlpath.toString()); // Your given URL. 

      HttpURLConnection c = (HttpURLConnection) url.openConnection(); 
      c.setRequestMethod("GET"); 
      c.setDoOutput(true); 
      c.connect(); // Connection Complete here.! 


      int lenghtOfFile = c.getContentLength(); 


      Log.d("Downloading Updates", "Lenght of file: " + lenghtOfFile); 

      String PATH = Environment.getExternalStorageDirectory() + "/download/"; 

      File file = new File(PATH); // PATH = /mnt/sdcard/download/ 

      if (!file.exists()) { 
       file.mkdirs(); 
      } 
      File outputFile = new File(file, app_name);   
      FileOutputStream fos = new FileOutputStream(outputFile); 



      InputStream is = c.getInputStream();/

      byte[] buffer = new byte[1024]; 
      int len1 = 0; 
      long total = 0; 
      while ((len1 = is.read(buffer)) != -1) { 
       total += len1; 
       publishProgress(""+(int)((total*100)/lenghtOfFile)); 

       fos.write(buffer, 0, len1); // Write In FileOutputStream. 
      } 
      fos.flush(); 
      fos.close(); 
      is.close(); 
     } catch (Exception e) {} 
     return null; 

    } 
    protected void onProgressUpdate(String... progress) { 
     Log.d("Downloading Updates",progress[0]); 
     mProgressDialog.setProgress(Integer.parseInt(progress[0])); 
    } 

    @Override 
    protected void onPostExecute(String unused) { 
     dismissDialog(DIALOG_DOWNLOAD_PROGRESS); 
     finish(); 
    } 
} 
} 
+0

謝謝Deepsan。 – David 2012-04-12 01:01:50

+0

它適用於zip或rar嗎? – albert 2016-10-20 05:28:09