0

約 40,000 個の MP3 ファイルを含む 140 MB の ZIP ファイルがあります。次のコードを使用して、ZIP ファイル内の特定のファイルを解凍せずに再生します。

String fullPath = Environment.getExternalStorageDirectory().getPath() + "_audio_.mp3";
String path = Environment.getExternalStorageDirectory().getPath() + "mySoundFolder";

try {           
ZipFile zip = new ZipFile(path + "myFile.zip");                     
Enumeration zipEntries = zip.entries();                          
ZipEntry entry = zip.getEntry("myFile" + "/" + currentWord + ".mp3"); 

if (entry != null) {
    Log.i(MAIN_TAG, "entry found: " + entry.getName());   
    InputStream in = zip.getInputStream(entry);  

        File f = new File(fullPath);
        FileOutputStream out = new FileOutputStream(f);     
        IOUtils.copy(in, out);
        byte buffer[] = new byte[4096];
        int read;
        while ((read = in.read(buffer)) != -1)
        { 
        out.write(buffer, 0, read);     
        }                       
            if (f.exists())                         
                {
                    Log.i(MAIN_TAG,"Audio file found!");   
                    final MediaPlayer mp = new MediaPlayer();
                    mp.setDataSource(fullPath); 
                    mp.prepare();
                    mp.setOnBufferingUpdateListener(null);
                    mp.setLooping(false);                   
                    mp.setOnPreparedListener(new OnPreparedListener()
                    { public void onPrepared(MediaPlayer arg0) 
                        { 
                            mp.start();                         
                        Log.i(MAIN_TAG,"Pronunciation finished!");
                        }});                                            

                        }
                    else
                    {
                        Log.i(MAIN_TAG,"File doesn't exist!!"); 
                    }                       
                } 
                else {
                    // no such entry in the zip
                    Log.i(MAIN_TAG, "no such entry in the zip");                
                 }              
            } 
            catch (IOException e) {

                e.printStackTrace();
             Log.i(MAIN_TAG,"IOException reading zip file");                
            }           
        }   

このコードには 2 つの奇妙な点があります。

  1. では問題なく動作しAndroid 2.2ますが、 では失敗しAndroid 4.0.3ます。では2.2期待どおりに MP3 ファイルを見つけて再生しますが、4.0.3では ZIP ファイル ( ) のエントリが見つからないと言い続けます"no such entry in the zip"
  2. MP3 ファイルの数を約 100 ファイルに減らすAndroid 4.0.3と、選択した MP3 ファイルが検索されて再生されます。

問題が何であるかを理解するのを手伝ってもらえますか?

よろしくお願いします。

4

1 に答える 1

0

最後に、この問題の回避策があります。zip ファイルを 2 つのファイルに分割し、それぞれに約20k entries. 出来上がり、それは再び魅力のように機能します。

以上の zip ファイルのエントリを読み取る際の Java の問題について聞いたことがあります64k entries。ファイルに約 40k エントリしかない理由がわかりませんが、問題にも直面しています。

于 2013-11-08T16:12:05.257 に答える