8

Android アプリを作成しています。複数のフォルダーから複数のファイルを読み取り、それらを複数の zip アーカイブに追加する必要があります。アーカイブの最大サイズを 16 MB に制限する必要があります。そのため、実行時にファイルをアーカイブに追加するときに、サイズが 16 MB を超える場合は、同じサイズ制限で別のアーカイブを作成します。次のラッパー クラスを使用しています。

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ChunkedZippedOutputStream {
    private ZipOutputStream zipOutputStream;

    private String path;

    private String name;

    private long currentSize;

    private int currentChunkIndex;

    private final long MAX_FILE_SIZE = 16 * 1000 * 1024; // 16mb limit

    private final String PART_POSTFIX = ".part";

    private final String FILE_EXTENSION = ".zip";

    public ChunkedZippedOutputStream(String path, String name) throws FileNotFoundException {
        this.path = path;
        this.name = name;
        constructNewStream();
    }

    public void addEntry(ZipEntry entry) throws IOException {
        long entrySize = entry.getCompressedSize();
        if ((currentSize + entrySize) > MAX_FILE_SIZE) {
            closeStream();
            constructNewStream();
        } else {
            currentSize += entrySize;
            zipOutputStream.putNextEntry(entry);
        }
    }

    private void closeStream() throws IOException {
        zipOutputStream.close();
    }

    private void constructNewStream() throws FileNotFoundException {
        zipOutputStream = new ZipOutputStream(new FileOutputStream(new File(path, constructCurrentPartName())));
        currentChunkIndex++;
        currentSize = 0;
    }

    private String constructCurrentPartName() {
        // This will give names is the form of <file_name>.part.0.zip, <file_name>.part.1.zip, etc.
        StringBuilder partNameBuilder = new StringBuilder(name);
        partNameBuilder.append(PART_POSTFIX);
        partNameBuilder.append(currentChunkIndex);
        partNameBuilder.append(FILE_EXTENSION);
        return partNameBuilder.toString();
    }
}

そして、私はそれを次のように使用します:

String zipPath = Environment.getExternalStorageDirectory() + "/MyApp/MyFolder/Zip/";
String zipName = "MyZipFle";
ChunkedZippedOutputStream zippedOutputStream = new ChunkedZippedOutputStream(zipPath, zipName);
....
zippedOutputStream.addEntry(new ZipEntry("ZipEntry" + i));

しかし、ChunkedZippedOutputStream オブジェクトのインスタンス化では、次のエラーが発生します。

  java.io.FileNotFoundException: /mnt/sdcard/MyApp/MyFolder/Zip/MyZipFle.part0.zip (No such file or directory)

パスの入力または名前に何か問題があることは知っていますが、何が原因かわかりません。

また、コード スニペットが正しくない場合は教えてください。ここから取得しました。巨大な zip ファイルを複数のボリュームに分割する方法は?

私の問題に対するより簡単な解決策があれば教えてください。ありがとうございました

4

2 に答える 2

13

出力ディレクトリが存在しません。解決策については、を参照File.mkdirs()してください。

于 2012-06-18T14:28:45.383 に答える