與NIO

2012-02-22 55 views
0

寫作GZIP文件這是我的代碼:與NIO

WritableByteChannel channel = null; 
GZIPOutputStream out = null; 
try { 
    channel = Channels.newChannel(new FileOutputStream("C:\\temp\\111.zip")); 

    out = new GZIPOutputStream(Channels.newOutputStream(channel)); 
    for (long i = 0; i < 10000000000; i++) {  
     out.write(("string" + i + "\n").getBytes()); 
    } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if (channel != null) { 
       channel.close(); 
      } 
     } catch (Exception e) { 
     } 
     try { 
      if (out != null) { 
       out.close(); 
      } 
     } catch (Exception e) { 
     } 
    } } 

我得到壓縮,但它的內容被損壞。

回答

1

如果你使用gzip流,你爲什麼要把它保存爲zip?使用.gz作爲擴展名。

編輯
假設它不是這裏有毛病.zip擴展(它仍然不好,雖然):

  1. 你或許應該考慮關閉它之前調用out.finish()
  2. 我很肯定你不需要所有的渠道東西。你可以簡單地傳遞給FileOutputStream中GZIPOutputStream
+0

名稱不是問題... – omrid 2012-02-22 11:47:31

+0

我想用nio來提高性能,但完成了!我現在正在爲一個巨大的文件運行測試... – omrid 2012-02-22 11:59:33

+0

另一個問題:如何設置壓縮文件的名稱?現在它具有相同的zip名稱但沒有擴展名。 – omrid 2012-02-22 12:06:04

0

我會做:

GZIPOutputStream gzipOS = new GZIPOutputStream(new FileOutputStream("C:\\temp\\111.gz")); 
WritableByteChannel out = Channels.newChannel(gzipOS); 

而且只需使用out.write()使用NIO來寫。不要忘記稍後關閉資源。

+0

out.write需要ByteBuffer – omrid 2012-02-22 11:53:40

+0

無論如何out.write(ByteBuffer.wrap((「string」+「\ n」)。getBytes()));同樣的結果損壞的文件 – omrid 2012-02-22 11:58:31

+0

是的,你需要'ByteBuffer'。你的意思是受損文件? – 2012-02-22 12:03:06

1

當你調用out.close()時,它也會關閉底層的流/通道。

如果先關閉底層通道,則無法寫入任何緩衝數據或頁腳。

GZIP格式包含一個CRC32,它必須在最後,直到你克服這個流之後才能被寫入,我期望這個文件丟失,所以文件內容不能被驗證。最簡單的解決方案是不要自己關閉底層渠道。

順便說一句:通常最好是按照與創建相反的順序關閉資源。 ;)