b java I/O 類源碼分析

—> go to 總目錄

java 處理讀寫的包,分佈在IO和NIO包裏面。

一、目錄

java官方教程的目錄,可以看出IO包的設計和結構
來源於JDK文檔

1.1 I/O Streams

Byte Streams 處理raw數據

Character Streams 自動轉化成本地字符集,字符對象的處理

Buffered Streams 帶緩存以減少native方法

Scanning and Formatting 允許從不同格式文件讀取

I/O from the Command Line 從標準輸入和控制檯對象讀入

Data Streams 從私有的Data對象(比如zip等)和String值

Object Streams 從對象中讀寫

1.2 File I/O (Featuring NIO.2)

path的概念

java.nio包中的基石 Path Class

path的操作

file的操作

設置文件屬性

隨機讀寫

遍歷文件樹

尋找文件

監控一個文件的改變

典型的File IO 代碼

二、I/O Streams

在這裏插入圖片描述
東西太多很難保證清晰不過可以分層

  • 模型接口 Bits、 FileSystem、 FileDescripter等,爲數據和文件系統提供模型
  • 功能接口 Closeable、FlushAble、Serilalizable,數據的關閉刷新和序列化
  • 上層讀寫接口 InputStream和OutputStream、Reader和Writer,console代表控制檯
  • 細分讀寫接口 結合目錄談到的分類的,細緻分工

2.2 模型接口

2.2.1 Bits

  • 字節工具類方法,爲byte arrays提供模型對象。
  • 二進制轉基礎類別
    比如把byte(8 bit)轉化爲Int (4 byte)
    在這裏插入圖片描述

2.2.2 FileDersecriptor

文件描述符。首先文件描述符是一個很通用的概念fd。這裏是fd的java模型。

  • int fd : in-0 處理輸入;out-1 輸出;err-2 異常;-1 非法文件;
    在這裏插入圖片描述
  • closeAll:功能是關閉所有相關的fd。因爲存在這一種情況,inptutStream或者OutPutStream新建時時層層新建的。存在父子關係,這個類用數組來保存父引用。底層關閉時就可以層層向上關閉。
    closeable的實現就是一堆Stream或者Reader/Writer

在這裏插入圖片描述

2.2.3 FilePermission

文件權限,就是linux的文件權限字符。提供文件權限的描述和工具

  • EXECUTE = 0x1;
  • WRITE = 0x2;
  • READ = 0x4;
  • DELETE = 0x8;
  • READLINK = 0x10;

2.2.4 FileSystem

文件系統,對文件的解析,操作。不同操作系統對文件的訪問方式都不同,主要體現在權限,分隔符,盤符等。
在這裏插入圖片描述

2.2.5 buffer模型

這個是nio的東西但是也很重要,提出來單講。
在這裏插入圖片描述

  • mark: mark = position;

  • reset: position = mark ;讀寫位置記爲標記位

  • clear ;清零

  • flip ;重讀操作
    在這裏插入圖片描述
    一般用於數據的轉運。比如
    在這裏插入圖片描述

  • rewind; position=0重頭開始讀

  • remain: limit - position 還剩多少字符

2.3 功能接口

2.3.1 Closeable

提供close()的方法接口。所有實現該接口的方法,都可以被close()。

2.3.2 Flushable

  • flush 方法
    將所有緩存的數據,發送給對端的Stream。

2.3.3 Serializable

提供序列化的能力,被序列化的類必須具有一個UUID。
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;

2.4 上層讀寫接口

2.4.1 console

最特殊的讀寫,從控制檯讀寫。新建時和具備console的設備綁定,一般是通過jvm綁定。

  • 基於charater字符讀寫

2.4.2 InputStream

  • 單字節讀取
  • 讀取到數組
  • 支持不支持mark–標記當前位置

核心就這一個模型

  • 0到EOF結尾,讀取到數組的時候,這是一個基礎模型
    在這裏插入圖片描述

2.4.3 OutputStream

和 inputStream相反。一般寫到對面流有兩步

  • write
  • flush–真正的刷新到對面的流

2.4.4 Reader

基於char的來讀寫,功能和inputStream類似。
但是所有的讀寫都是基於charbuffer,理解了這個數據結構就是理解了,reader

charbuffer 提供對char的操作集合

但是這個僅僅是一個抽象類,依賴不同字符集的具體實現
在這裏插入圖片描述
數據模型
在這裏插入圖片描述

2.4.5 Writer

同Reader和OutputStream,多了append函數

2.5 詳細模型接口

會詳細介紹第一個,後面的實現類都雷同。

InputStream在這裏插入圖片描述

  • FileInputStream
    以文件爲入口參數,讀寫file
    在這裏插入圖片描述

  • ByteArrayInputStream
    也是類似的buffer模型,內置一個數組去讀寫
    在這裏插入圖片描述

  • PipedintputStream

  • 管道的概念,首先管道是用於線程間通信的

  • 管道是一對的,有個connect概念。

  • PipedInputStream內置buffer數組進行信息交換時的存儲

  • PipedOutputStream保留一個應用sink。這樣就實現了線程間通信的工能。
    在這裏插入圖片描述
    在這裏插入圖片描述

  • SequenceInputStream
    不行前面幾個,始終針對一個stream,它保留有一個列表。讀取的時候可以批量的讀取
    在這裏插入圖片描述

  • FilterInputStream
    很精簡的一個類,可以保留一個傳入的in,基於這個傳入inputStream進行操作,而不是像其他的直接新建。
    在這裏插入圖片描述

  • BufferedInputStream
    繼承FilterInputStream類,內置buffer,讀寫從buffer中進行,不直接和steam交+ pushbackInputStream
    繼承FilterInputStream類,內置一個unread方法:position=position-len。實現讀後指針復位,相當於沒讀。

  • DataInputStream
    內置了類型的轉化
    在這裏插入圖片描述

OutputStream、Reader、Writer

類似,不過Reader和Writer都是基於字符集的讀寫。

三、FileIO NIO 2.0

NIO包是一個完整的network包,其中對文件的操作很方便,被廣泛使用。
定義在NIO的File目錄下,

3.1 Path的概念

在這裏插入圖片描述

軟連接 單純的引用,相當於快捷方式
硬鏈接 相當於副本,但是和源文件會同步更新

3.2 文件模型

File

在I/O包中。提供簡單的文件操作。是文件的抽象模型
在這裏插入圖片描述

Path

在NIO包中,對路徑概念的抽象模型。都是
在這裏插入圖片描述

Paths

Path的靜態方法工具類。但是定義很少,看來沒用。
在這裏插入圖片描述

Files

文件的操作的工具類
在這裏插入圖片描述

  • 文件的增刪複製
  • 文件的讀寫、屬性修改
  • channel 雙工讀寫通道

文件操作類型,調用write等函數時,默認的行爲

枚舉
WRITE 文件寫
APPEND 追加讀寫
TRUNCATE_EXISTING 創建新文件文件設爲0size
CREATE_NEW 創建文件,如果文件存在就拋出異常
CREATE 文件存在就不創建,不存在就創建
DELETE_ON_CLOSE close就刪除用於臨時文件
SPARSE – Hints that a newly created file will be sparse. This advanced option is honored on some file systems, such as NTFS, where large files with data “gaps” can be stored in a more efficient manner where those empty gaps do not consume disk space.
SYNC 同步讀寫
DSYNC 異步讀寫

3.3 隨機讀寫

其實不是隨機讀取到意思,是直接讀取指定位置的意思。
在這裏插入圖片描述

3.4 遍歷文件

FileVisitor

文件鉤子,意思就是打開或者關閉文件會觸發。

  • preVisitDirectory 目錄被查看之前觸發
  • postVisitDirectory 目錄被查看之後觸發
  • visitFile 文件被查看之後
  • visitFileFailed 文件讀取失敗後觸發

3.5 find文件

3.6 監視文件事件

4. 使用接口

FilterInputStream

博客
僅僅讓類實現了裝飾器,
在這裏插入圖片描述
有一堆子類。

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