2013-04-16 1 views
1

코드는 어떻게 디스크 공간 사용을 최적화하고 길이 압축을 푼 파일을 알아서 큰 바이트 []를 만들 수 없습니다, [] 한 번에

GZIPInputStream gzis= new GZIPInputStream(bais); 
byte[] bBodyUnzipped= new byte[10240]; 
gzis.read(bBodyUnzipped); 

의를 바이트 GZIP 파일을 읽어?

this answer에 따르면 그러한 방법은 없습니다.

아이디어는 내가 모든 콘텐츠 및 별도의 제로와 bytye []를 필요로 이런 이유로

CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder(); 
String sBodyUnzipped= decoder.decode(ByteBuffer.wrap(bBodyUnzipped)).toString(); 

를 호출이 바이트 []를 사용하는 것입니다.

답변

1

더 작은 byte 어레이로 읽습니다.

+0

나는 보통 1024 2048 – Khanser

1

Apache Commons IOUtils를 사용할 수 없습니까? 우편 이진 정보가 포함 된 경우

+0

의 버퍼를 사용 나는 어떤 방법을 사용할 수 있습니다 : 대안은 블록으로 읽는 것입니다? 고맙습니다. –

+0

toByteArray (InputStream input) –

0

당신이 바이트로 그것을 바이트를 처리 할 수 ​​

InputStream is = new BufferedInputStream(new GZIPInputStream(
      new FileInputStream("zip"))); 
    for (int b; (b = is.read()) != -1;) { 
     // process byte 
    } 

우편 텍스트가 다음 라인 라인으로이를 처리하는 경우 예를 들어

Scanner sc = new Scanner(new GZIPInputStream(new FileInputStream("zip"))); 
    while(sc.hasNextLine()) { 
     String line = sc.nextLine(); 
     // process line 
    } 
0

난 당신이 원하는 생각 :

public void gzip(String path) { 
      GZIPInputStream in = null; 
      try { 
       in = new GZIPInputStream(
         new FileInputStream(new File(path))); 
       byte[] read = new byte[in.available()]; 
       in.read(read); 
       System.out.println(read); 
      }catch (Exception e) { 
       System.out.println(e); 
      } 
      finally { 
       try { 
        in.close(); 
       }catch (Exception e) { 
        System.out.println(e); 
       } 
      } 
     } 

자세한 내용은 http://docs.oracle.com/javase/6/docs/api/java/io/FileInputStream.html을 참조하십시오.

+1

예, 이것이 원하는 사항입니다. 그러나 in.available 메소드는 InflaterInputStream 클래스 (java doc 참조)에 의해 오버라이드됩니다 (http://docs.oracle.com/javase/6/docs/api/java/util/zip/InflaterInputStream.html#available%28%). 29), 0 또는 1 만 반환합니다. –

+0

ok. 나는 그것이 fileInputStream에 사용 된 것과 같다고 생각하기 때문에 항상이 접근법을 사용합니다. 조언 덕분에. 아마도 in.read가 우리에게 유용한 정보를주기 때문에 루프를 사용하여 이것을 고칠 수 있습니다. 나는 그것을 시도 할게요, 만약 당신이 이미 발견하게되면 해결 해주십시오. 제발 저에게 알려주세요. –

0

모든 콘텐츠를 한 번에 읽을 수있는 방법을 찾지 못했습니다.

private static String unzip(GZIPInputStream gzis) { 
    CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder(); 
    byte[] bBodyUnzipped= new byte[1024]; 
    String sBodyUnzipped= null; 
    int offset= 0; 
    int bodyLength= 0; 
    do { 
     bodyLength= gzis.read(bBodyUnzipped, offset, 1024); 
     sBodyUnzipped+= decoder.decode(ByteBuffer.wrap(bBodyUnzipped, 0, bodyLength)).toString(); 
     offset+= bodyLength; 
    } while(bodyLength < 0); 
    return sBodyUnzipped; 
} 
0
public byte[] readGZFile(File file) { 

    byte[] fileData = null; 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    GZIPInputStream in = null; 
    try { 
     in = new GZIPInputStream(new FileInputStream(file)); 
     int bufsize=1024; 
     byte [] buf=new byte[bufsize]; 
     int readbytes=0; 
     readbytes=in.read(buf); 
     while(readbytes!=-1){ 
      baos.write(buf, 0,readbytes); 
      readbytes=in.read(buf); 
     } 
     baos.flush(); 
     return baos.toByteArray(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      in.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
    return fileData; 
}