-1

Java ByteArrayOutputstream を使用してファイルを圧縮しようとしていますが、失敗しました。出力ストリームを FileOutput ストリームに変更すると、機能する可能性があります。

これが私のコードです(申し訳ありませんが、私の英語はとても貧弱です):

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import org.apache.commons.io.FileUtils;

public class ZipOutputStreamTest {

public static void main(String args[]) throws IOException {
    test1();
    test2();
}

/*this failed, the exported file can't be open*/
public static void test1() throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ZipOutputStream zos = genZip(baos);
    byte[] bytes = baos.toByteArray();
    FileUtils.writeByteArrayToFile(new File("d:\\test1.zip"), bytes);
    FileOutputStream fos = new FileOutputStream(new File("d:\\test1.zip"));
    for(byte b : bytes){
        fos.write(b);
    }
    fos.close();
    zos.close();
    baos.close();
}

/*this can work*/
public static void test2() throws IOException {
    FileOutputStream fileOutputStream = new FileOutputStream("d:\\test2.zip");
    ZipOutputStream zos = genZip(fileOutputStream);
    zos.close();
    fileOutputStream.close();
}

public static ZipOutputStream genZip(OutputStream os) throws IOException{
    ZipOutputStream zos = new ZipOutputStream(os, Charset.forName("gbk"));
    for(int i=0;i<5;i++){
        ZipEntry entry = new ZipEntry("ab"+i+".txt");
        zos.putNextEntry(entry);
        zos.write("中文asaf".getBytes());
        zos.closeEntry();
        }
        return zos;
    }
}

ありがとう!

4

2 に答える 2

1

FileOutputStream を FileUtils.writeByteArrayToFile(...) と一緒に使用するのはなぜですか? 同じデータを 2 回書き込みます。

test1() での FileOutputStream の使用を削除します。このようなもの:

public static void test1() throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ZipOutputStream zos = genZip(baos);
    zos.close();
    baos.close();

    byte[] bytes = baos.toByteArray();
    FileUtils.writeByteArrayToFile(new File("d:\\test1.zip"), bytes);
}
于 2014-10-21T09:11:09.283 に答える
0

同様の問題に直面しました.. zos.finish(); を追加すると解決しました。

于 2016-03-04T17:54:53.783 に答える