I/O

一、File 類

  • file.list() 列出文件夾的所有文件
  • FilenameFilter 接口 file.list(FilenameFilter filter) 時選擇性過濾文件
  • 用 File 進行目錄遍歷
  • 策略模式:對特定的文件進行特定的處理
  • File 讀取文件信息(絕對路徑、可讀、可寫、最后修改時間等)
  • File 刪除文件、重命名、創建文件夾

二、Tips

匿名內部類的使用場景

  • 特定的,一次性使用的類。優點:能夠將解決特定問題的代碼聚攏到一起。缺點:代碼不易讀。
  • 傳向匿名內部類的參數必須為 final(這樣設計和局部變量作用域有關)

大端法和小端法

  • 大端法:對于int、float等大于一個字節的數據,順序儲存字節
  • 小端法:逆序儲存字節
  • ByteBuffer 可設置大端法或小端法儲存數據

三、InputStream/OutputStream

InputStream API 方法

InputStream API

InputStream 類圖

InputStream 類圖

OutputStream API 方法

OutputStream API

OutputStream 類圖

OutputStream 類圖
  • 裝飾模式:減少了類的數量,但是創建一個流時往往要新建多個對象。

四、Reader/Writer

  • BufferedReader 為什么沒有繼承 FilterReader
  • Reader 和 InputStream 如何適配(適配器模式)
  • 類繼承圖

五、InputStream/OutputStream 和 Reader/Writer 的比較

  • InputStream/OutputStream 處理字節(byte),某些類添加了將字節轉換成字符的功能,但會出現很多亂碼問題;
  • Reader/Writer 處理字符(char)

六、RandomAccessFile

  • 獨立于 InputStream/OutputStream 系統存在的類,繼承了 DataInput 和 DataOutput 接口??蓪ξ募M行讀寫操作,可看做包含了 DataInputStream/DataOutputStream 兩者的功能。
  • 行為與 InputStream/OutputStream 本質上有不同:游標可以移動到文件的任意位置。InputStream/OutputStream 有 mark() 和 reset() 方法,但是局限性很大。RandomAccessFile 的 seek() 方法很靈活。
  • getFilePointer(): find where you are in the file
  • seek(): move to a new point in the file
  • length(): determined the maximun size of the file
  • 兩種模式 "r","rw",沒有 "w" 模式

七、標準 I/O

  • System.out 和 System.err 是裝飾好的,System.in 要進行手工裝飾
  • System.out 是一個 PrintWriter 對象
  • 可以將標準 I/O 重定向輸出,setIn(InputStream),setOut(PrintStream),setErr(PrintStream),在日志在屏幕上打印難以看清時將其重定向到文件會很有用

八、Buffer and Channel

  • 可以獲取 Channel 的類:FileInputStream、FileOutputStream、RandomAccessFile
  • 為 Buffer 分配資源:allocate\allocateDirect,手動分配以提高效率,要根據具體運行環境調參
  • buffer.flip() 為寫做準備;buffer.clear() 為讀做準備
  • channel:transferTo、transferFrom 不同流間傳輸
  • 獲取 ByteBuffer 不同類型數據的 View:asShortBuffer() 等

NIO 類關系圖:

new io

九、Memory-mapped files

  • 如果文件太大,不能一次性讀入內存,可以使用 Memory-mapped file 方便操作。對于大文件,此類可以大大提高速度

十、File locking

  • 對文件全部或部分加鎖,鎖對于非java應用也是可見的(取決于操作系統,用FileLock.isShared()判斷)
  • tryLock(long position,long size,boolean shared) 獲取不到鎖則返回 null
  • lock(long position,long size,boolean shared) 獲取不到鎖則等待,一直到獲取成功,或線程終止

十一、Compression

  • 畫類圖
  • DeflaterOutputStream 和 InflaterInputStream 處理壓縮文件的類繼承自 InputStream 和 OutputStream
  • GZIPOutputStream 和 GZIPInputStream 用法和傳統 InputStream 和 OutputStream 類似
  • ZipOutputStream 和 ZipInputStream 可以進行多個文件的壓縮(putNextEntry())

十二、Object serialization 序列化

  • 繼承 Serialization(標簽接口,不包含方法)的類可以進行序列化,序列化即將對象轉換成bytes儲存起來,隨后可以恢復成原樣。
  • RMI 和 JavaBean 都需要序列化的支持。
  • 序列化不僅儲存這個類本身,還會儲存它引用的類
  • 在反序列化類時,如果這個類沒有被加載,則會報 ClassNotFound 錯誤

自定義序列化

有些信息,比如用戶密碼,你不想將其序列化存到文件中,這時需要自定義序列化

  • 繼承 Externalizable 接口,并重寫 readExternal() 和 writeExternal()。此種方法反序列化時要調用構造方法,因此沒有保存其引用的對象,引用對象需要在 readExternal() 和 writeExternal() 顯示保存。見 P708 的代碼。
  • 繼承 Serialization 接口,反序列化時并不經過構造方法。private 成員變量也會被序列化,如果想避開某個成員變量(如密碼),可以使用 transient 關鍵詞
  • 繼承 Serialization 接口,并添加 readObject 方法和 WriteObject 方法,并在需要時調用 defaultReadObject 方法和 defaultWriteObject

注意事項

  • 兩個對象 A、B 同時引用第三個對象 C(P714),只要是在同一個流中序列化和反序列化,同樣的對象將會恢復成同一個引用,即完全恢復對象網。
  • static 成員不會被自動序列化
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,501評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,673評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,610評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,939評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,668評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,004評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,001評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,173評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,705評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,426評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,656評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,139評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,833評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,247評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,580評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,371評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,621評論 2 380

推薦閱讀更多精彩內容

  • 一、流的概念和作用。 流是一種有順序的,有起點和終點的字節集合,是對數據傳輸的總成或抽象。即數據在兩設備之間的傳輸...
    布魯斯不吐絲閱讀 10,080評論 2 95
  • File File類,文件路徑,既代表了一個特定文件的名稱,有能代表一個目錄下的一組文件的名稱(list()方法,...
    MAXPUP閱讀 366評論 0 1
  • File 相關類 RandomAccessFile:獨立的隨機訪問文件讀寫類。 示例:列出文件夾中的目錄 Inpu...
    iDragonfly閱讀 229評論 0 0
  • 一陣清風吹過,撩起了愛與書店的門簾,淺綠色半透明的門簾與清風做舞,舞出了夏天最美好的樣子。雨和坐在收銀臺,捧著一本...
    Phoenixstone閱讀 608評論 0 0
  • 臺風剛剛過 今天天晴 太陽嬌滴滴的“現深” 陽光所到之處都洋溢著自由的光輝 不出意外今晚又可以跳舞啦 再加上昨天終...
    JENY_f22c閱讀 122評論 0 2