2014-10-21 1 views
-1

Java ByteArrayOutputstream을 사용하여 파일을 압축하려고했지만 실패했습니다 .Ouputstream을 FileOutput 스트림으로 변경하면 작동 할 수 있습니다. 작동하도록하려면 어떻게해야합니까?Java로 파일 압축 ByteArrayOutputstream

여기 (내 영어가 너무 좋지 Sorrry) 내 코드입니다 :

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; 
    } 
} 

감사합니다!

답변

1

왜 FileUtils.writeByteArrayToFile (...)과 함께 FileOutputStream을 사용하고 있습니까? 동일한 데이터를 두 번 쓰십시오.

test1()에서 FileOutputStream 사용을 제거하십시오. 이런 식으로 뭔가 : 나는 zos.finish을 추가 할 때

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); 
} 
+0

당신의 도움을위한 탱크. 나는 test1()에서 FileOutputStream을 제거했지만 여전히 작동하지 않습니다. – showstone

+0

흠, 흥미 롭습니다. 내 컴퓨터에 코드를 시작하고 예상 결과가 나타납니다. http://i.imgur.com/h6dQonL.png –

0

나는() 문제가 해결되었다 .. 비슷한 문제에 직면했다;