2013-04-16 6 views
1

в кодепрочитать файл GZip в байты [] сразу

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

, как можно оптимизировать использование дискового пространства, а не создавать большие байты [], зная файл распакована длиной?

Согласно this answer нет такого метода.

Идея заключается в том, чтобы использовать эти байты [] для вызова

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

По этой причине мне нужна bytye [] со всем содержанием и без каких-либо дополнительных нулей.

ответ

1

Читайте в меньшем byte массиве.

+0

Я обычно использую буферы 1024 или 2048 – Khanser

1

Не можете ли вы просто использовать Apache commons IOUtils?

+0

Какой метод можно использовать? Спасибо. –

+0

toByteArray (вход InputStream) –

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; 
} 
Смежные вопросы