《瘋狂的JAVA講義》筆記-第15章輸入輸出

《瘋狂的JAVA講義》筆記-第15章輸入輸出

  • 序列化
    • 由於遠程調用時需要將對象進行序列化,所以建議每個javaBean 都實現 SerializableExternalizable,前者無需實現任何方法就可以成爲可序列化對象,否則則使用在 需要自定義序列化行爲的情景。
    • 序列化對象的東西有 對象 Field (包括基本類型、引用類型),不會序列化的東西有方法,static Field,transient Field 。因此以下修改並不需要修改序列化版本,即serialVersionUID :
      • 僅修改了方法,static/transient Field
    • 如果出現版本一致,但是 同名Field 的數據類型不同時,則反序列化失敗
    • 如果已序列化的對象比新類的 Field ,則忽略這些 Field
    • 如果已序列化的對象比新類的 Field ,則這些 Field 爲其類型的初始值
    • 反序列化的讀入順序要跟 序列化的寫入順序一致,因爲在同一個實例只會序列化一次,再次序列化同樣的實例則只會寫入其序列化編號,以保證序列化的同樣的對象仍然指向同一個實例。
      序列化同一個引用類型
    • 反序列化並沒有調用類的構造器
  • 字節流與字符流
    • 字節流是以字節爲單位讀寫的流(一個字節),字符流是以字符爲單位(兩個字節),但本質上是使用字節來保存文件的
    • 字節流使用的類名稱是 InputStreamOutputStream ,字符流使用的類名稱是 ReaderWriter
    • 轉換流:使用 InputStreamReader 可以將 字節流 轉爲 字符流
    • PushbackInputStream 可以unread一些已經被讀的數據,推回到數據源。PushbackInputStream pushback = new PushbackInputStream(new FileInputStream("/a.txt"))
  • RandomAccessFile
    • 提供 void seek(long position) long getFilePointer() 方法,可以實現非順序訪問
  • Buffer
    • 讀數據前要先進行 buffer.flip()limit 移到position 的位置,避免讀到 null 數據
    • 寫數據前要先進行buffer.clearlimit = capacity 以及positon = 0
    • allocate() 以及 allocateDirect(),後者的創建成本高,但是讀取效率高
  • Channel
    • Channel 可以將文件通過 MapedByteBuffer全部映射 到內存裏,且只可以通過 Buffer進行讀寫
    • 建議通過 XxxInputStream.getChannel 的方法獲取相對應的 Channel 實例
  • JAVA 7NIO.2
    • 文件工具類Files :方法有walkFileTree(Path start, FileVisitor<? super Path>) 其中 FileVisitor代表一個文件訪問器,在遍歷子目錄以及文件時,觸發其不同的方法,如:postVisitDirectory(T dir,IOException exce) : 遍歷子目錄時觸發該方法以及 visitFile(T File,BasicFileAttrbutes attrs) :訪問file文件是觸發該方法 。這些方法都返回 FileVisitResult 枚舉類,決定在方法結束後,文件訪問器的行爲。
    • Path工具類中WatchService 監控文件工具。可以監聽指定文件夾/文件的事件

END

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章