I/O

一、File 類

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

二、Tips

匿名內(nèi)部類的使用場景

  • 特定的,一次性使用的類。優(yōu)點(diǎn):能夠?qū)⒔鉀Q特定問題的代碼聚攏到一起。缺點(diǎn):代碼不易讀。
  • 傳向匿名內(nèi)部類的參數(shù)必須為 final(這樣設(shè)計和局部變量作用域有關(guān))

大端法和小端法

  • 大端法:對于int、float等大于一個字節(jié)的數(shù)據(jù),順序儲存字節(jié)
  • 小端法:逆序儲存字節(jié)
  • ByteBuffer 可設(shè)置大端法或小端法儲存數(shù)據(jù)

三、InputStream/OutputStream

InputStream API 方法

InputStream API

InputStream 類圖

InputStream 類圖

OutputStream API 方法

OutputStream API

OutputStream 類圖

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

四、Reader/Writer

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

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

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

六、RandomAccessFile

  • 獨(dú)立于 InputStream/OutputStream 系統(tǒng)存在的類,繼承了 DataInput 和 DataOutput 接口。可對文件進(jìn)行讀寫操作,可看做包含了 DataInputStream/DataOutputStream 兩者的功能。
  • 行為與 InputStream/OutputStream 本質(zhì)上有不同:游標(biāo)可以移動到文件的任意位置。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" 模式

七、標(biāo)準(zhǔn) I/O

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

八、Buffer and Channel

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

NIO 類關(guān)系圖:

new io

九、Memory-mapped files

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

十、File locking

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

十一、Compression

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

十二、Object serialization 序列化

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

自定義序列化

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

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

注意事項

  • 兩個對象 A、B 同時引用第三個對象 C(P714),只要是在同一個流中序列化和反序列化,同樣的對象將會恢復(fù)成同一個引用,即完全恢復(fù)對象網(wǎng)。
  • static 成員不會被自動序列化
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容