2

我已經將兩個媒體文件夾放入一個zip文件夾中,總共有100k個媒體文件在zip文件夾中。我需要從zip文件夾的特定文件夾播放單個文件。問題是,首先Zip文件夾的全部內容被完全讀取,然後訪問必要的文件。因此,播放單個文件需要超過55秒的時間。我需要一個解決方案來減少播放音頻文件所耗費的時間。如何從一個100k音頻文件集合中分離出兩個文件夾來播放單個音頻文件?

下面是我的代碼:

long lStartTime = System.currentTimeMillis(); 
      System.out.println("Time started"); 
      String filePath = File.separator+"sdcard"+File.separator+"Android"+File.separator+"obb"+File.separator+"com.mobifusion.android.ldoce5"+File.separator+"main.9.com.mobifusion.android.ldoce5.zip"; 
      FileInputStream fis = new FileInputStream(filePath); 
      ZipInputStream zis = new ZipInputStream(fis); 
      String zipFileName = "media"+File.separator+"aus"+File.separator+fileName; 
      String usMediaPath = "media"+File.separator+"auk"+File.separator; 
      ZipEntry entry; 
      int UnzipCounter = 0; 
      while((entry = zis.getNextEntry())!=null){ 
      UnzipCounter++; 
       System.out.println(UnzipCounter); 
       if(entry.getName().endsWith(zipFileName)){ 
        File Mytemp = File.createTempFile("TCL", "mp3", getActivity().getCacheDir()); 
        Mytemp.deleteOnExit(); 
        FileOutputStream fos = new FileOutputStream(Mytemp); 
        for (int c = zis.read(); c!=-1; c= zis.read()){ 
         fos.write(c); 
        } 
        if(fos!=null){ 
         mediaPlayer = new MediaPlayer(); 
        } 
        fos.close(); 
        FileInputStream MyFile = new FileInputStream(Mytemp); 
        mediaPlayer.setDataSource(MyFile.getFD()); 
        mediaPlayer.prepare(); 
        mediaPlayer.start(); 
        mediaPlayer.setOnCompletionListener(this); 
        long lEndTime = System.currentTimeMillis(); 
        long difference = lEndTime - lStartTime; 
        System.out.println("Elapsed milliseconds: " + difference); 
        mediaPlayer.setOnErrorListener(this); 
       } 
       zis.closeEntry(); 
      } 
      zis.close(); 

回答

2

儘量不要再解壓縮文件,因爲它消耗太多的時間。 而不是重新解壓縮該文件,您可以按照以下步驟:

  1. 第一次啓動應用程序時解壓縮文件。設置我們已經啓動應用程序的標誌,使用偏好。
  2. 在下次啓動時,檢查標誌。如果應用程序以前從未啓動,則首先執行。如果它在查找文件和播放之前已經啓動。

如果你真的不能使用這些步驟,因爲這是你的要求,你可以嘗試使用truezip vfs。但請注意,我以前從未使用過它。 在這裏庫: https://truezip.java.net/,https://github.com/jruesga/android_external_libtruezip

+1

FYKI,我們不解壓縮文件。它是一個zip文件,我們直接訪問zip文件中的音頻文件。 –

+0

@MahalakshmiSaravanan我真的很抱歉它滑落在我的大腦中。 這可能是因爲您使用錯誤的方式來迭代zip文件。 這可能是一個幫助:[如何迭代zip文件記錄](http://java-performance.info/how-to-iterate-zip-file-records/) –

+0

按照你的方法,它需要時間來檢索文件。我在我的Zip文件中有3個文件夾,可以在一段時間內訪問第一個文件夾中的文件,但第二個和第三個文件夾文件的檢索時間超過53秒。你能幫我嗎? –