2014-09-22 11 views
0

블랙 베리 앱을 개발 중이며 다운로드를 계속하는 동안 문제가 있습니다. 다운로드가 중단되지 않으면 코드가 제대로 작동하지만 중단되고 다운로드가 다시 시작되면 미디어 파일이 왜곡됩니다.다운로드를 다시 시작하면 blackberry java 미디어 파일이 왜곡됩니다.

다운로드를 다시 허용하려면 서버에서 청크로 파일을 요청하고 마지막으로 성공적으로 다운로드/기록 된 청크를 유지하십시오. 따라서 다운로드를 다시 시작하려면 마지막으로 다운로드하고 작성한 청크를 확인하고 증분하여 서버에서 요청할 범위를 결정하십시오. 내 코드는 아래에 나열되어 있습니다. :

public final class Downloader extends Thread { 

    private String remoteName; 
    private String localName; 
    private String parentDir; 
    private String dirName; 
    public String fileName; 

    private int chunkSize = 512000; 
    public boolean completed = false; 
    public boolean failed = false; 

    public CacheObject cacheObject = null 

    public Downloader(String remoteName, String localName, String musicTitle, String parentDir, String dirName) { 

     this.remoteName = remoteName; 
     this.parentDir = parentDir; 
     this.dirName = dirName; 
     this.localName = localName; 
     this.secureDownload = false; 
     this.musicTitle = musicTitle; 

     this.cacheObject = CachedObject.getInstance().findCachedObject(musicTitle); 

     if (this.cacheObject == null) // create new object 
      this.cacheObject = new CachedObject(musicTitle, remoteName); 

     this.thisObj = this; 
    } 

    public void run() { 
     downloadFile(localName); 
    } 

    public void downloadFile(String fileName) { 
     try { 
      int chunkIndex = 0; int totalSize = 0; 

      String tempFileName = "file:///" + FileConnect.getInstance().FILE_ROOT+parentDir+ FileConnect.getInstance().FILE_SEPARATOR; 

      if (!FileConnect.getInstance().fileExists(tempFileName)) 
       FileConnect.getInstance().createDirectory(parentDir); 

      if (dirName != null) { 
       tempFileName = "file:///" + FileConnect.getInstance().FILE_ROOT+ parentDir + "/" + dirName + FileConnect.getInstance().FILE_SEPARATOR; 

       if (!FileConnect.getInstance().fileExists(tempFileName)) 
        FileConnect.getInstance().createDirectory(parentDir + "/" + dirName); 
      } 

      fileName = tempFileName + fileName; 
      this.fileName = fileName; 


      file = (FileConnection) Connector.open(fileName, Connector.READ_WRITE); 

      if (!file.exists()) { 
       file.create(); 
      } 

      if(cacheObject.file_path.length() < 1) 
       cacheObject.file_path = fileName; 

      file.setWritable(true); 

      // Trying to check the file size. 
      long fSize = (int)file.fileSize(); 

      // If it is greater than 1 byte, then we open an output stream at the end of the file 
      if(fSize > 1){ 
       out = file.openOutputStream((fSize+1)); 
      } 
      else{ 
       out = file.openOutputStream(); 
      } 


      int rangeStart = 0; int rangeEnd = 0; 


      // Want to know the total fileSize on server (used for updating the UI.. 
      HttpConnection conn2; 
      conn2 = (HttpConnection) Util.getHttpConnection(remoteName); 
      String totalFileSize = "" + conn2.getLength(); 
      conn2.close(); 

      //Number of chunks 
      int numChunks = (int) Math.ceil(Integer.parseInt(totalFileSize)/chunkSize); 
      cacheObject.chunk_size = numChunks; 


      // Set the total file size.. 
      content_length = Integer.parseInt(totalFileSize); 
      fileSize = 0; 
      String url = remoteName + HttpRequestDispatcher.getConnectionString(); 


      if(cacheObject.last_successfully_downloaded_chunk > -1){ 
       //This is a resume.. 
       if((cacheObject.last_successfully_downloaded_chunk + 1) < numChunks){ 
        chunkIndex = cacheObject.last_successfully_downloaded_chunk + 1; 

        fileSize = cacheObject.curr_download_size; 
       }    
      }  



      while (file != null) { 
       try{ 
        conn = (HttpConnection)Connector.open(url); 

        if(chunkIndex < (numChunks-2)){ 
         rangeStart = chunkIndex * chunkSize; rangeEnd = rangeStart + chunkSize - 1; 
        } 
        else{ 
         rangeStart = chunkIndex * chunkSize; 
         int remainingBytes = Integer.parseInt(totalFileSize) - rangeStart; rangeEnd = rangeStart + (remainingBytes - 1); 
        } 

        conn.setRequestProperty("User-Agent", "Profile/MIDP-2.0 Configuration/CLDC-1.0"); 
        conn.setRequestProperty("Connection", "keep-alive"); 


        conn.setRequestProperty("Range", "bytes=" + rangeStart + "-" + rangeEnd); 
        responseCode = conn.getResponseCode();     

        if (responseCode != 200 && responseCode != 206) {  
        out.flush(); out.close(); file.close(); in.close(); conn.close(); 
        in = null; conn = null; file = null; out = null; 
        Thread.yield(); break; 
        } 
        else{ 

        in = conn.openInputStream(); int length = -1; 
        byte[] readBlock = new byte[256]; 

        while ((length = in.read(readBlock)) != -1) { 
         out.write(readBlock, 0, length); 
         fileSize += length; 
         cacheObject.curr_download_size = fileSize; 
        } 

        totalSize += fileSize; 


        in.close(); conn.close(); in = null; conn = null; 

         // Update after the byte read.. 
         cacheMusicbox.last_successfully_downloaded_chunk = chunkIndex; 
         CachedObject.getInstance().saveCachedObject(cacheObject); 

         System.out.println("Last successful chunk downloaded: " + cacheObject.last_successfully_downloaded_chunk); 

         chunkIndex++; 
         if(chunkIndex == numChunks){ 
          out.flush(); out.close(); file.close(); break; 
         } 

         Thread.yield(); 
        } 
       } 
       // Network error related 
       catch(Exception e){ 
       System.out.println("Download failed. Some kind of error - " + e.getMessage()); 
       System.out.println("fileSize b4 closed: ." + file.fileSize());    
       System.out.println("Last successful chunk downloaded: " + cacheMusicbox.last_successfully_downloaded_chunk); 

        if (out != null) { 
         out.flush(); out.close(); 
         System.out.println("We just closed the outputStream"); 
         System.out.println("fileSize when closed: ." + file.fileSize()); 
        } 
        if (file != null && file.exists()) { 
         if (file.isOpen()) {   
          file.close(); 
         } 
        } 

        in = null; conn = null; file = null; out = null; 
        failed = true; 
        System.out.println("Ensuring this block is called " + cacheObject.last_successfully_downloaded_chunk); 

        break; 
       } 
      } 


      System.out.println("Full file downloaded: " + totalSize + " Bytes"); 
      System.out.println("Wrote file to local storage"); 
      Thread.sleep(3000); 

      if(!failed) 
       completed = true; 

     } 
     // any other error... 
     catch (Exception e) { 
      System.out.println(e.getMessage()); 

      try{ 
       out.flush(); out.close(); file.close();   
       in = null; conn = null; file = null; out = null; 
      } 
      catch(Exception ee){ 
       System.out.println("While closing catch that belongs to the top guy: " + ee.getMessage()); 
      } 
      failed = true; 
     } 
    } 

} 

답변

0

결국 나는이 작업을 마쳤습니다. 이 희망이 사람을 도와 두통을 절약 할 수 있습니다, 내가 한 일이었다 .. : 나는 다운로드를 재개 싶다면

, 나는이 방법을 따르에 따르면 (필자는 파일 크기를 확인

  1. 을 RIM, fileSize는 파일에 포함 된 바이트 수에 해당합니다) 파일의 끝에 outputStream을 엽니 다.
  2. 그 끝에서 서버로 파일을 요청하기 시작합니다. 예를 들어 파일 크기가 링크가 꺼질 때 500kb라고하면 파일의 끝까지 도달 할 때까지 범위 500- (500 + chunkSize) .
  3. 그리고이 과정은 질문에 명시된대로 계속됩니다.