3

zip 形式の DOCX ファイルでマイナーなテキスト置換を行うためのツールを作成しています。私の方法はZipEntry、元のファイルのエントリから変更されたファイルにZipOutputStream. ほとんどの DOCX ファイルではこれでうまくいきますが、ときどき、私が書いた内容とファイルに含まれるメタ情報(通常は圧縮サイズの違い)ZipExceptionの間の不一致に関する問題に遭遇することがあります。ZipEntry

コンテンツをコピーするために使用しているコードは次のとおりです。簡潔にするために、エラー処理とドキュメント処理を省略しました。今のところ書類記入で困ったことはありません。

ZipFile         original = new ZipFile(INPUT_FILENAME);
ZipOutputStream outputStream = new ZipOutputStream(new FileOutputStream(OUTPUT_FILE));
Enumeration     entries = original.entries();
byte[]          buffer = new byte[512];
while (entries.hasMoreElements()) {
    ZipEntry    entry = (ZipEntry)entries.nextElement();
    if  ("word/document.xml".equalsIgnoreCase(entry.getName())) {
        //perform special processing
    }
    else{
        outputStream.putNextEntry(entry);
        InputStream in = original.getInputStream(entry);
        while (0 < in.available()){
            int read = in.read(buffer);
            outputStream.write(buffer,0,read);
        }
        in.close();
    }
    outputStream.closeEntry();
}
outputStream.close();

ZipEntryオブジェクトをあるオブジェクトからZipFile別のオブジェクトに直接コピーする適切な方法または慣用的な方法は何ですか?

4

2 に答える 2

9

エラーを回避する回避策を見つけました。ZipEntry名前フィールドのみを設定して新しいものを作成することで、コンテンツを問題なくコピーできます。

ZipFile         original = new ZipFile(INPUT_FILENAME);
ZipOutputStream outputStream = new ZipOutputStream(new FileOutputStream(OUTPUT_FILE));
Enumeration     entries = original.entries();
byte[]          buffer = new byte[512];
while (entries.hasMoreElements()) {
    ZipEntry    entry = (ZipEntry)entries.nextElement();
    if  ("word/document.xml".equalsIgnoreCase(entry.getName())) {
        //perform special processing
    }
    else{
        // create a new empty ZipEntry
        ZipEntry newEntry = new ZipEntry(entry.getName()); 
//      outputStream.putNextEntry(entry);
        outputStream.putNextEntry(newEntry);
        InputStream in = original.getInputStream(entry);
        while (0 < in.available()){
            int read = in.read(buffer);
            if (read > 0) {
              outputStream.write(buffer,0,read);
            }
        }
        in.close();
    }
    outputStream.closeEntry();
}
outputStream.close();

ただし、この方法では、元のフィールドに保存されているメタ情報ZipEntry(コメント、追加など) が失われます。API ドキュメントは、これが重要かどうか明確ではありません。

于 2012-08-02T14:56:40.830 に答える
0

zip エントリのメタデータを保持するには、ZipEntry の「コピー コンストラクタ」を使用して作成します。

ZipEntry newEntry = new ZipEntry(entry); 

次に、名前やコメントなどだけを変更すると、他のすべてが指定された .xml からコピーされentryます。

Java から DocX ファイルを取り込むことができるDocmosisも参照してください。

于 2012-08-08T01:03:12.067 に答える