ZipFile と ZipEntry ~Androidでzipを解凍する を参考に ZIP ファイルを解凍してみる。
ボタンをクリックして、SDカード/パッケージ名/sample.zip ファイルを SDカード/パッケージ名/sample/ に解凍。 ※sample.zip は sample ディレクトリを含むZIP [java] public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);
Button zipAcvhiveButton = (Button) findViewById(R.id.zipArchiveButton);
zipAcvhiveButton.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
String zipfileName = "sample.zip";
String baseDir = Environment.getExternalStorageDirectory().getPath()
+ "/" + v.getContext().getPackageName() + "/";
String zipPath = baseDir + zipfileName;
String sampleDir = baseDir + "sample";
new File(sampleDir).mkdir();
zipArchiveFiles(zipPath, baseDir);
}
});
}
public void zipArchiveFiles(String zipPath, String outputDir)
{
err = 0;
try {
ZipFile zipFile = new ZipFile(zipPath);
Enumeration<? extends ZipEntry> enumeration = zipFile.entries();
while(enumeration.hasMoreElements())
{
ZipEntry zipEntry = enumeration.nextElement();
String outputPath = outputDir + zipEntry.getName();
zipArchiveFile(zipPath, zipEntry.getName(), outputPath);
}
zipFile.close();
}
catch(Exception ex)
{
err = -1;
Log.d( "Err", "" + ex);
}
}
public int err = 0;
public void zipArchiveFile(String zipPath, String file, String outFile)
{
err = 0;
try
{
ZipFile zipFile = new ZipFile(zipPath);
ZipEntry entry = zipFile.getEntry(file);
InputStream inputStream = zipFile.getInputStream(entry);
OutputStream outputStream = new FileOutputStream(outFile);
byte[] buffer = new byte[ 1024 * 4 ];
int r = 0;
while( -1 != ( r = inputStream.read(buffer)) )
{
outputStream.write( buffer, 0, r );
}
outputStream.close();
inputStream.close();
zipFile.close();
}
catch( Exception ex )
{
err = -1;
Log.d( "Err", "" + ex);
}
}
[/java] Android の Zip書き出しは、ちょっと手続きが多いみたいです。
Environment.getExternalStorageDirectory().getPath() で SDカードのパスが取得できる。 zipFile.entries() でZip一覧(ZipEntry を継承したEnumeration)を取得し、ループで1ファイルずつ解凍する。 ちなみに、zipEntry.getName() でファイル名を取得するが、Zip にディレクトリを含む場合はディレクトリを含むパスになる。
sample/xxxx.txt
Zip からの書き出しは ZipFile() で各ファイルパスを指定し、zipFile.getInputStream() でInputStream オブジェクトを取得。
InputStream をループで回し、OutputStream で指定したパスにファイルを書き出す。 ※サンプルの場合、1024 x 4 バイトずつ処理
うーん、もうちょっと簡単にならないのかな? もしかしたら、他の方法もあるかも知れませんが。。。