2011-10-04 71 views
1

您認爲此代碼正確關閉輸出流條目嗎?知道這不是同一類型的輸出流。關閉特定輸出流的方法

OutputStream out = new JarOutputStream(new FileInputstrem(fileName)); 
         ... 
((ZipOutputStream)out).closeEntry(); 

但考慮到兩者都是輸出流,我以爲他們以同樣的方式關閉。因此,在我的情況下,((ZipOutputStream)out).closeEntry();((JarOutputStream)out).closeEntry();相同

您是否可以確認如果您認爲是真的或糾正了我的錯誤? 謝謝。

回答

2

如果您需要調用特定於ZipOutputStreamout變量方法,那麼它的類型不應該是OutputStream,但ZipOutputStream

ZipOutputStream out = new JarOutputStream(new FileInputstrem(fileName)); 
        ... 
out.closeEntry(); 

這不會引起任何問題,因爲自從JarOutputStream延伸ZipOutputStreamJarOutputStream也是ZipOutputStream(並且也是OutputStream,並且也是Object)。

+0

謝謝我不知道JarOutputStream是擴展ZipOutputStream,它不是特定於ZipOutputStream的調用方法,而是創建通用方法來創建Zip和Jar歸檔,並使用常用方法在此方法中關閉其輸出流條目。但現在我知道JarOutputStream繼承ZipOutputStream,這是最容易實現的。謝謝。 – damson

+0

如果'JarOutputStream'沒有擴展'ZipOutputStream',那麼'(ZipOutputStream)'會導致'ClassCastException'。 – aioobe

+0

不一定,因爲close條目爲所有輸出流條目執行相同的工作。這就是我問這個問題的原因。我不確定。 – damson

2

由於JarOutputStream延伸ZipOutputStream,由於在Java中所有的方法都是虛擬的,做

((ZipOutputStream) out).closeEntry(); 

調用完全相同的方法屁股

((JarOutputStream) out).closeEntry(); 

不過,我建議你做靜態型更精確一些:

ZipOutputStream out = new JarOutputStream(new FileInputstrem(fileName)); 
        ... 
out.closeEntry(); 
+0

感謝您的回答。 – damson

+0

沒問題,不客氣。 – aioobe

0
ZipOutputStream.closeEntry(); 

JarOutputStream.closeEntry(); 

都關閉ZIP條目,所以你可以寫另一個進入歸檔文件(如果你想存儲超過一個文件分割成一個ZIP/JAR)。他們不會關閉輸出流本身。如果你想關閉你的JarOutputStream和底層的FileOutputStream,使用 out.close();

參見: http://download.oracle.com/javase/1.4.2/docs/api/java/util/zip/ZipOutputStream.html#close() http://download.oracle.com/javase/1.4.2/docs/api/java/util/zip/ZipOutputStream.html#closeEntry()

1

也因此在我的情況((ZipOutputStream)出).closeEntry();與((JarOutputStream)out(012)相同。

這是正確的。沒有理由寫任何前者。

+0

是的,確實如此。 最新的答案,但很好。謝謝。 – damson