我打電話給一個返回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());
看起來像一個大問題是,eBay說他們給我一個gzip,但它實際上是一個zip。 –