2013-03-26 8 views
7

アンドロイドアセットにzipファイルを保存します。どのようにしてアンドロイドの内部ストレージにファイルを抽出しますか?私はファイルを取得する方法を知っているが、私はそれを抽出する方法を知らない。 DAndroidアセットのファイルを解凍する

+0

uを取得しているかの問題?どこで内部ストレージまたは外部ストレージ内のzipファイルを抽出したいですか? –

+0

あなたは、アセットがAndroidツールによって圧縮されていることはどうにか知っています。だからあなたはそこにZIPファイルを置くことによって二重の圧縮をしている。ファイルをまとめてバンドルする場合は、次のようにします。tarを使用しますか?あなたは圧縮せずにジッパーをしますか?バンドルが目的でない場合は、ファイルをそのまま置いて、Androidツールチェーンに圧縮を残してください。 – akauppi

答えて

14

このコードはあなたを助けます....オブジェクトを作成している間に、抽出されたファイルをこのクラスに保存する場所を渡してください...そして解凍メソッドを呼び出してください...

Sreedev Rソリューション、 に基づいて
public class Decompress { 
    private String zip; 
    private String loc; 

    public Decompress(String zipFile, String location) { 
    zip = zipFile; 
    loc = location; 

    dirChecker(""); 
    } 

    public void unzip() { 
    try { 
     FileInputStream fin = new FileInputStream(zip); 
     ZipInputStream zin = new ZipInputStream(fin); 
     ZipEntry ze = null; 
     while ((ze = zin.getNextEntry()) != null) { 
     Log.v("Decompress", "Unzipping " + ze.getName()); 

     if(ze.isDirectory()) { 
      dirChecker(ze.getName()); 
     } else { 
      FileOutputStream fout = new FileOutputStream(loc + ze.getName()); 
      for (int c = zin.read(); c != -1; c = zin.read()) { 
      fout.write(c); 
      } 

      zin.closeEntry(); 
      fout.close(); 
     } 

     } 
     zin.close(); 
    } catch(Exception e) { 
     Log.e("Decompress", "unzip", e); 
    } 

    } 

    private void dirChecker(String dir) { 
    File f = new File(_location + dir); 

    if(!f.isDirectory()) { 
     f.mkdirs(); 
    } 
    } 
} 
+0

ありがとうございます。それは働いた:D – kyuu

+0

私がupvotingによって私をサポートしてくれたなら、あなたを助けてくれるよ... –

+0

こんにちは、私は20MBのファイルを解凍しようとしていて、それは長い時間を取っている.. –

1

たぶん、あなたはからのInputStreamとの組み合わせでのFileOutputStreamを使用してみてください。これは..助けるため

Util zip ;

zip = new Util();

zip.copyFileFromAsset(this, "myfile.zip", getExternalStorage()+ "/android/data/edu.binus.profile/");

おかげで私のコードですZIPファイル。パッケージファイルでは、これはうまくいくはずです。

this questionから@wordyを引用する:ProGuardのに問題があるかもしれないよう

PackageManager pm = context.getPackageManager(); 
String apkFile = pm.getApplicationInfo(context.getPackageName(), 0).sourceDir; 
ZipFile zipFile = new ZipFile(apkFile); 
ZipEntry entry = zipFile.getEntry("assets/FILENAME"); 
myInput = zipFile.getInputStream(entry); 
myOutput = new FileOutputStream(file); 
    byte[] buffer = new byte[1024*4]; 
int length; 
int total = 0; 
int counter = 1; 
while ((length = myInput.read(buffer)) > 0) { 
    total += length; 
    counter++; 
    if (counter % 32 == 0) { 
     publishProgress(total); 
    } 
     myOutput.write(buffer, 0, length); 
} 

は見えますが、うまくいけば、コードサンプルは、あなたのために働きます。

0

私はまだテストしていませんが、プロジェクトを実行している間にOCR私はダウンロードしたファイルをネットから解凍する方法があるlibraryに出くわしました。ファイルを解凍する正確な方法は、classの下にあるinstallZipFromAssets(String sourceFilename,File destinationDir,File destinationFile)です。お探しのとおりです

0

暗号化などの追加機能を提供するzip4j外部ライブラリを利用することもできます。また、パスを提供する特定の場所にファイルを抽出する機能も備えています。

5

私は、資産と使用バッファからファイルを読み込むためのオプションを追加しました:

package com.pixoneye.api.utils; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.zip.ZipEntry; 
import java.util.zip.ZipInputStream; 

import android.content.Context; 
import android.util.Log; 

public class Decompress { 
    private static final int BUFFER_SIZE = 1024 * 10; 
    private static final String TAG = "Decompress"; 

    public static void unzipFromAssets(Context context, String zipFile, String destination) { 
     try { 
      if (destination == null || destination.length() == 0) 
       destination = context.getFilesDir().getAbsolutePath(); 
      InputStream stream = context.getAssets().open(zipFile); 
      unzip(stream, destination); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void unzip(String zipFile, String location) { 
     try { 
      FileInputStream fin = new FileInputStream(zipFile); 
      unzip(fin, location); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 

    } 

    public static void unzip(InputStream stream, String destination) { 
     dirChecker(destination, ""); 
     byte[] buffer = new byte[BUFFER_SIZE]; 
     try { 
      ZipInputStream zin = new ZipInputStream(stream); 
      ZipEntry ze = null; 

      while ((ze = zin.getNextEntry()) != null) { 
       Log.v(TAG, "Unzipping " + ze.getName()); 

       if (ze.isDirectory()) { 
        dirChecker(destination, ze.getName()); 
       } else { 
        File f = new File(destination + ze.getName()); 
        if (!f.exists()) { 
         FileOutputStream fout = new FileOutputStream(destination + ze.getName()); 
         int count; 
         while ((count = zin.read(buffer)) != -1) { 
          fout.write(buffer, 0, count); 
         } 
         zin.closeEntry(); 
         fout.close(); 
        } 
       } 

      } 
      zin.close(); 
     } catch (Exception e) { 
      Log.e(TAG, "unzip", e); 
     } 

    } 

    private static void dirChecker(String destination, String dir) { 
     File f = new File(destination + dir); 

     if (!f.isDirectory()) { 
      boolean success = f.mkdirs(); 
      if (!success) { 
       Log.w(TAG, "Failed to create folder " + f.getName()); 
      } 
     } 
    } 
} 
関連する問題