すべてがすでにDDMSにあるファイルを圧縮および解凍する方法:data/data/mypackage/files/
そのための簡単な例が必要です。すでにZipとunzipに関連する検索を行っています。しかし、私に利用できる例はありません。誰でもいくつか例を挙げることができます。事前に感謝します。
Zip機能のJava.util.Zip。*クラスをご覧ください。以下に貼り付けた基本的なZip/unzipコードをいくつか作成しました。それが役に立てば幸い。
public static void Zip(String[] files, String zipFile) throws IOException {
BufferedInputStream Origin = null;
ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile)));
try {
byte data[] = new byte[BUFFER_SIZE];
for (int i = 0; i < files.length; i++) {
FileInputStream fi = new FileInputStream(files[i]);
Origin = new BufferedInputStream(fi, BUFFER_SIZE);
try {
ZipEntry entry = new ZipEntry(files[i].substring(files[i].lastIndexOf("/") + 1));
out.putNextEntry(entry);
int count;
while ((count = Origin.read(data, 0, BUFFER_SIZE)) != -1) {
out.write(data, 0, count);
}
}
finally {
Origin.close();
}
}
}
finally {
out.close();
}
}
public static void unzip(String zipFile, String location) throws IOException {
try {
File f = new File(location);
if(!f.isDirectory()) {
f.mkdirs();
}
ZipInputStream zin = new ZipInputStream(new FileInputStream(zipFile));
try {
ZipEntry ze = null;
while ((ze = zin.getNextEntry()) != null) {
String path = location + ze.getName();
if (ze.isDirectory()) {
File unzipFile = new File(path);
if(!unzipFile.isDirectory()) {
unzipFile.mkdirs();
}
}
else {
FileOutputStream fout = new FileOutputStream(path, false);
try {
for (int c = zin.read(); c != -1; c = zin.read()) {
fout.write(c);
}
zin.closeEntry();
}
finally {
fout.close();
}
}
}
}
finally {
zin.close();
}
}
catch (Exception e) {
Log.e(TAG, "Unzip exception", e);
}
}
提供されているZip関数brianesteyは正常に機能しますが、unzip関数は一度に1バイトずつ読み込むため、非常に遅くなります。バッファーを使用し、はるかに高速なunzip機能の修正版を以下に示します。
/**
* Unzip a Zip file. Will overwrite existing files.
*
* @param zipFile Full path of the Zip file you'd like to unzip.
* @param location Full path of the directory you'd like to unzip to (will be created if it doesn't exist).
* @throws IOException
*/
public static void unzip(String zipFile, String location) throws IOException {
int size;
byte[] buffer = new byte[BUFFER_SIZE];
try {
if ( !location.endsWith(File.separator) ) {
location += File.separator;
}
File f = new File(location);
if(!f.isDirectory()) {
f.mkdirs();
}
ZipInputStream zin = new ZipInputStream(new BufferedInputStream(new FileInputStream(zipFile), BUFFER_SIZE));
try {
ZipEntry ze = null;
while ((ze = zin.getNextEntry()) != null) {
String path = location + ze.getName();
File unzipFile = new File(path);
if (ze.isDirectory()) {
if(!unzipFile.isDirectory()) {
unzipFile.mkdirs();
}
} else {
// check for and create parent directories if they don't exist
File parentDir = unzipFile.getParentFile();
if ( null != parentDir ) {
if ( !parentDir.isDirectory() ) {
parentDir.mkdirs();
}
}
// unzip the file
FileOutputStream out = new FileOutputStream(unzipFile, false);
BufferedOutputStream fout = new BufferedOutputStream(out, BUFFER_SIZE);
try {
while ( (size = zin.read(buffer, 0, BUFFER_SIZE)) != -1 ) {
fout.write(buffer, 0, size);
}
zin.closeEntry();
}
finally {
fout.flush();
fout.close();
}
}
}
}
finally {
zin.close();
}
}
catch (Exception e) {
Log.e(TAG, "Unzip exception", e);
}
}
File
の代わりにString
を使用します。この回答は、 @ brianesteyの優れた回答 に基づいています。
私は彼のZip
メソッドを修正して、ファイルパスの代わりにファイルのリストを受け入れ、ファイルパスの代わりに出力Zipファイルを受け入れます。
public static void Zip( List<File> files, File zipFile ) throws IOException {
final int BUFFER_SIZE = 2048;
BufferedInputStream Origin = null;
ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile)));
try {
byte data[] = new byte[BUFFER_SIZE];
for ( File file : files ) {
FileInputStream fileInputStream = new FileInputStream( file );
Origin = new BufferedInputStream(fileInputStream, BUFFER_SIZE);
String filePath = file.getAbsolutePath();
try {
ZipEntry entry = new ZipEntry( filePath.substring( filePath.lastIndexOf("/") + 1 ) );
out.putNextEntry(entry);
int count;
while ((count = Origin.read(data, 0, BUFFER_SIZE)) != -1) {
out.write(data, 0, count);
}
}
finally {
Origin.close();
}
}
}
finally {
out.close();
}
}