2012-04-01 69 views
0

我有一段代碼是這樣的...如何解壓縮文件並將其讀取到Java中的ByteBuffer?

FileInputStream fi = new FileInputStream(filein); 
GZIPInputStream gzis = new GZIPInputStream(fi); 
ByteBuffer bbuffer = ByteBuffer.allocate(115200); 

fi.available()是84300,但gzis.available()只有1 file(filein)已經被壓縮。

我想讀取文件,解壓縮它,最後把它放到我的ByteBuffer bbufer

我怎麼能實現這個操作?

+0

*「THX 4」*感謝將來拼寫所有字母的單詞,例如'thanks'和'for'。這是一個技術網站,而不是短信或Twitter。 – 2012-04-01 04:02:23

+0

如果您的問題已得到解答,或者不再有效,請勾選以選擇最合適的答案,以便大家都知道問題已得到解決。謝謝。 – wattostudios 2012-05-14 13:29:01

回答

0

gzis.available() = 1;並不意味着存在問題,它只是意味着您只能從流中讀取1個字節的信息,然後才能繼續。你不能指望整個未壓縮文件將在一個命令中可用。

要讀取整個文件,您需要有一個循環來繼續讀取InputStream,直到獲得所有數據。例如...

int bytesRead = 0; 
int bytesAvailable = gzis.available(); 
while (bytesAvailable > 0){ 
    gzis.read(bbuffer,bytesRead,bytesAvailable); 
    bytesRead += bytesAvailable; 
    bytesAvailable = gzis.available(); 
} 

當然,如果你不知道的未壓縮文件的最終大小,你需要額外的代碼添加到讓你bbuffer如果你需要更多的被調整房間。

+0

BufferedOutputStream bos = new BufferedOutputStream(new GZIPOutputStream(new FileOutputStream(out)),1024 * 8); bos.write(buffer.array());所以,兄弟,當我壓縮像這樣的文件,是嗎? – Hexor 2012-04-01 09:07:48

+0

不確定'buffer.array()'位 - 這取決於*** ***是什麼。如果它的'byte []緩衝區',那麼你只需要調用'bos.write(buffer);'你也可能不需要'BufferedOutputStream',因爲'GZIPOutputStream'已經包含了一個緩衝區。然而,如果你願意的話,把'BufferedOutputStream'放在那裏並不會傷害到它。 – wattostudios 2012-04-02 12:57:30

相關問題