第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 Java 的 InflaterInputStream(和其他類似類)

為什么 Java 的 InflaterInputStream(和其他類似類)

狐的傳說 2023-06-08 14:46:30
在 Java 8 中,close()方法InflaterInputStream如下所示public void close() throws IOException {    if (!closed) {        if (usesDefaultInflater)            inf.end();        in.close();        closed = true;    }}usesDefaultInflater是一個布爾值,僅true當使用下面的構造函數(shù)時public InflaterInputStream(InputStream in) {    this(in, new Inflater());    usesDefaultInflater = true;}任何其他構造函數(shù)(例如下面的構造函數(shù))都會導致此布爾值設置為 falsenew InflaterInputStream(decryptInputStream, new Inflater(), 4096);因此,除非您使用默認構造end()函數(shù),否則不會在 上調用該方法,這意味著在 Finalizer 線程可能在關閉后很長時間內調用Inflater該方法之前會消耗不必要的本機內存。請參閱下面的實現(xiàn)。finalizeInflaterInflaterInputStreamInflater/** * Closes the decompressor and discards any unprocessed input. * This method should be called when the decompressor is no longer * being used, but will also be called automatically by the finalize() * method. Once this method is called, the behavior of the Inflater * object is undefined. */public void end() {    synchronized (zsRef) {        long addr = zsRef.address();        zsRef.clear();        if (addr != 0) {            end(addr);            buf = null;        }    }}/** * Closes the decompressor when garbage is collected. */protected void finalize() {    end();}為了解決這個問題,你需要像這樣重寫close方法InflaterInputStreamnew InflaterInputStream(decryptInputStream, new Inflater(), 4096) {        @Override    public void close() throws IOException {        try {            super.close();        } finally {            inf.end();        }    }}end()這很容易被忽略,在我看來,默認調用并允許用戶通過提供一個您可以指定的構造函數(shù)來覆蓋該行為可能是明智的false,或者至少是一個使用默認值Inflater但也允許您設置緩沖區(qū)大小。無論如何,我猜它的設計方式有一些合乎邏輯的原因,而我只是沒能理解它。希望有人能賜教。。。這也適用于DeflaterInputStream、DeflaterOutputStream等InflaterOutputStream。
查看完整描述

2 回答

?
牧羊人nacy

TA貢獻1862條經(jīng)驗 獲得超7個贊

Java Runtime Library 中有許多方法采用例如 an?OutputStream(例如Files.copy())。除非這些方法明確聲明該方法將關閉流,否則不會關閉流。關閉流是流“所有者”的責任,例如方法的調用者。

類似地,InflaterInputStreamthat的構造函數(shù)都不會Inflater聲明它們將end()執(zhí)行Inflater,這意味著它們不會執(zhí)行。在需要時由調用者來結束它。

Inflater當使用為您創(chuàng)建的構造函數(shù)時, 成為該內部InflaterInputStream的“所有者”?,因此結束.?InflaterInflaterInputStreamInflater

資源管理

資源管理的一般準則是,除非另有說明,分配資源的人負責釋放(關閉、結束……)資源。

Inflater是一種資源,因此應用正常的資源管理規(guī)則。


查看完整回答
反對 回復 2023-06-08
?
弒天下

TA貢獻1818條經(jīng)驗 獲得超8個贊

與許多“為什么”問題一樣,這是一個有根據(jù)的猜測。我沒有看到任何明確的解釋,所以誰知道原來的程序員在想什么?無論如何,請對我的回答持保留態(tài)度。

其他構造函數(shù)都采用實例Inflater,這意味著用戶具有對 (internal) 的引用Inflater。請注意,這些類沒有吸氣劑Inflater。因此,用戶引用它的唯一方法是從外部傳遞它(好吧,那并使用反射,但我們不要去那里)。

所以也許假設是因為用戶通過了他自己的Inflater實例,然后他想管理自己Inflater,可能會在這個蒸汽結束后重新使用它。因此,Inflater在流關閉時關閉不是一個好主意。


查看完整回答
反對 回復 2023-06-08
  • 2 回答
  • 0 關注
  • 186 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號