自定義包裝類並不能成功拷貝檔案的原因分析

2021-06-05 11:33:14 字數 919 閱讀 9838

仿bufferedinputstream自定義包裝類mybufferedinputstream如下:

class mybufferedinputstream 

public int myread() throws ioexception else if (count > 0)

return -1;

} public void myclose()throws ioexception

}public class copy***

bis.myclose();

bos.close();

}

測試發現並不能拷貝檔案,從語法跟邏輯上貌似都找不到問題,但是仔細觀察會發現,自定義類的myread()方法要求返回int型別,而此函式的return b返回的b卻是byte型別。這兩個型別的區別byte是八位,而int是32位。因為在計算機內部,資料是由0和1組成,有可能出現11111111111000000101001010連續為1或0的情況,當byte型別的b讀取乙個位元組時,如果讀到的是1111-1111,那麼翻譯成十進位制就是-1,即使由byte公升級為int型別,也是-1,所以在while迴圈的時候就會停止下來。

解決方案如下:

修改前byte型-1為11111111公升級為int型後補1變為11111111-11111111-11111111-11111111,現在如果把補1變為補0,則結果成了00000000-00000000-00000000-11111111,就不是-1了,而是255了,這樣就實現了既保住原資料也避免了-1的情況。不要擔心提公升之後資料量增加,在read讀到32位之後,write方法只會講低8位寫入檔案,因此前面補的0也就不會寫入檔案了,拷貝後的檔案就與原檔案完全相同了。實現補0效果的方法是與運算:b&0xff或者b&255。本題中在所有return b的地方都做如下修改return b&0xff就行了

基本包裝型別和自定義物件

再講之前,先給大家普及一下js中的資料型別 總共分為兩種 1.number 2.string 3.boolean 4.null 5.undefined 1.object 2.function 3.array 4.date 5.regexp 介紹完了,接下來就來說說基本型別的包裝 主要有number,...

自定義異常類

自定義並捕獲 一 第一種定義方式,繼承exception類 public class myfirstexception extends exception public myfirstexception string msg public myfirstexception string msg,th...

自定義異常類

除了程式裡已經定義好的標準異常類以外,還可以自定義自己的異常類,但通常也和其他標準異常類一樣派生於exception類例如對於乙個 類,如果規定當且僅當任意兩邊長度之和大於第三邊,才能試圖建立乙個三角形或者改變乙個邊長時也不要改變此性質。如果改變了丟擲乙個異常 同時每條邊不能是負數,否則也丟擲異常。...