文章目錄
- 一、目錄
- 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)
- 二、I/O Streams
- 三、FileIO NIO 2.0
- 4. 使用接口
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
博客
僅僅讓類實現了裝飾器,
有一堆子類。