2009-11-16 23 views
5

我打電話給一個返回gzip文件的服務。我的數據是來自響應的InputStream(禮貌javax.activation.DataHandler.getInputStream();)。如何從GZIPed數據的InputStream獲取解壓縮數據的InputStream?

我想要做的是,不寫入任何東西到磁盤,得到解壓縮數據的輸入流在檔案中的文件。在這種情況下,壓縮文件是一個xml文檔,我試圖使用帶有InputStream的javax.xml.bind.Unmarshaller解組。

我正在嘗試將InputStream寫入OutputStream(解壓縮數據),然後我需要將它寫回InputStream。它還沒有工作,所以我想我會看看是否有更好的(我希望如此)的方法。

我可以將初始InputStream寫入磁盤並獲取一個gz文件,然後讀取該文件,從中獲取壓縮文件並從那裏出去,但我寧願將它保留在內存中也是可能的。

更新1:這是我目前(不工作 - 獲得「非gzip格式」除外):

ByteArrayInputStream xmlInput = null; 
    try { 
     InputStream in = dh.getInputStream(); //dh is a javax.activation.DataHandler 
     BufferedInputStream bis = new BufferedInputStream(in); 
     ByteArrayOutputStream bo = new ByteArrayOutputStream(); 
     int bytes_read = 0; 
     byte[] dataBuf = new byte[4096]; 
     while ((bytes_read = bis.read(dataBuf)) != -1) { 
      bo.write(dataBuf, 0, bytes_read); 
     } 
     ByteArrayInputStream bin = new ByteArrayInputStream(bo.toByteArray()); 
     GZIPInputStream gzipInput = new GZIPInputStream(bin); 
     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     dataBuf = new byte[4096];; 
     bytes_read = 0; 
     while ((bytes_read = gzipInput.read(dataBuf)) > 0) { 
      out.write(dataBuf, 0, bytes_read); 
     } 
     xmlInput = new ByteArrayInputStream(out.toByteArray()); 

如果不是寫一個ByteArrayOutputStream我寫一個FileOutputStream第一次圍繞我得到一個壓縮文件(我可以手動打開以獲取XML文件)和服務(易趣)說它應該是一個gzip文件,所以我不知道爲什麼我得到一個「不在GZIP格式」錯誤。

更新2:我嘗試了一些有點不同 - 相同的錯誤(「不是在GZIP格式」)。哇,我只是試圖用分號結束括號。無論如何,這是我第二次嘗試,但仍然不起作用:

ByteArrayInputStream xmlInput = null; 
    try { 
     GZIPInputStream gzipInput = new GZIPInputStream(dh.getInputStream()); 
     ByteArrayOutputStream bo = new ByteArrayOutputStream(); 
     int bytes_read = 0; 
     byte[] dataBuf = new byte[4096]; 
     while ((bytes_read = gzipInput.read(dataBuf)) != -1) { 
      bo.write(dataBuf, 0, bytes_read); 
     } 
     xmlInput = new ByteArrayInputStream(bo.toByteArray()); 
+0

看起來像一個大問題是,eBay說他們給我一個gzip,但它實際上是一個zip。 –

回答

2

下面的代碼應該可以工作。請記住,您必須正確處理異常。

OutputStream out = null; 
InputStream in = null; 
try { 
    out = /* some output stream */; 
    in = new java.util.GZIPInputStream(/*some stream*/); 
    byte[] buffer = new byte[4096]; 
    int c = 0; 
    while ((c = in.read(buffer, 0, 4096)) > 0) { 
     out.write(buffer, 0, c); 
    } 
} finally { 
    if (in != null) { 
     in.close(); 
    } 
    if (out != null) { 
     out.close(); 
    } 
} 
0

看看GZIPInputStream。 Here's an example;該類非常透明地處理它,幾乎沒有使用的工作。

+1

只是好奇:爲什麼expliticily 1.4.2?爲什麼不只是最新的這裏? http://java.sun.com/javase/6/docs/api/java/util/zip/GZIPInputStream.html – BalusC

+0

對不起,我應該與「我認爲首先在1.4.2中可用」一起去。讓我編輯一個。 :-) –

+0

我正在看我目前正在使用的GZIPInputStream,雖然我得到了「Not in GZIP format」異常。我不明白這一點,因爲我可以將文件寫入磁盤,它是一個壓縮文件(根據文檔gzip)。我會添加我目前(不工作)的問題。 –

相關問題