Java工程師知識樹 / Java基礎
文章目錄
-
-
-
- IO與流的概念:
- java.io包
- java.io包下流的分類
-
- 按流向分:
- 按資料傳輸機關分:
- 按功能分:
- java.io常用類
- Java中IO與NIO
-
- Java IO與NIO之間的主要差别
- JavaIO流的用處
-
-
IO與流的概念:
IO:I/O是Input/Output的縮寫, I/O技術是非常實用的技術, 用于處理裝置之間的資料傳輸。
流:流是用來讀寫資料的。當程式需要讀取資料的時候,就會開啟一個通向資料源的流,這個資料源可以是檔案,記憶體,或是網絡連接配接。類似的,當程式需要寫入資料的時候,就會開啟一個通向目的地的流。這時候你就可以想象資料好像在這其中“流”動一樣。從流中取得資料的操作稱為提取操作(輸出),而向流中添加資料的操作稱為插入操作(輸入)。
java.io包
Java把不同來源和目标的資料都統一抽象為資料流。

JavaIO原理:Java中IO是以資料流為基礎進行輸入輸出的,所有資料被串行化寫入輸出流,或者從輸入流讀入。
在Java類庫中,IO操作包括:輸入輸出流,檔案的操作,網絡傳輸資料流,字元串流,對象流,zip檔案流。
Java的IO包作用的描述: 通過資料流,序列号和檔案系統提供系統輸入和輸出。
從功能上區分在Java類庫中包含三個部分:
- 流式部分――IO的主體部分,如:InputStream、OutputStream、Writer、Reader等;
-
非流式部分――主要包含一些輔助流式部分的類,如:File類、RandomAccessFile類和FileDescriptor等類;
java.io.File類是檔案和目錄路徑名的抽象表示,并且java.io.File類的執行個體可以表示檔案系統的對象,例如檔案或目錄。是以JDK将java.io.File類放到了java.io包下。
- 其他類――檔案讀取部分的與安全相關的類,如:SerializablePermission類,以及與本地作業系統相關的檔案系統的類,如:FileSystem類和Win32FileSystem類和WinNTFileSystem類。
java.io包下流的分類
按流向分:
輸入流: 程式可以從中讀取資料的流。特點:能夠向輸入流中添加資料
輸出流: 程式能向其中寫入資料的流。特點:能夠從輸出流中取得資料
以InputStream、OutputStream作為抽象基類。輸入流和輸出流都是站在程式的角度上來說。
描述 | 位元組流(抽象基類) | 字元流(抽象基類) |
---|---|---|
輸入流 | InputStream | Reader |
輸出流 | OutputStream | Writer |
按資料傳輸機關分:
位元組流: 以位元組為機關傳輸資料的流
字元流: 以字元為機關傳輸資料的流
以Writer、Reader作為抽象基類。
位元組流和字元流選擇
- 位元組流: 位元組流讀取的時候,讀到一個位元組就傳回一個位元組; 主要用于讀取圖檔,MP3,AVI視訊檔案。
- 字元流: 字元流使用了位元組流讀到一個或多個位元組,如讀取中文時,就會一次讀取2個位元組。隻要是處理純文字資料,就要優先考慮使用字元流。
描述 | 位元組流(抽象基類) | 字元流(抽象基類) |
---|---|---|
輸入流 | InputStream | Reader |
輸出流 | OutputStream | Writer |
按功能分:
位元組流: 用于直接操作目标裝置的流
過濾流: 是對一個已存在的流的連結和封裝,通過對資料進行處理為程式提供功能強大、靈活的讀寫功能。
抽象基類 | 節點流(檔案流) | 緩沖流(處理流的一種) |
---|---|---|
InputStream | FileInputStream | BufferedInputStream |
OutputStream | FileOutputStream | BufferedOutputStream |
Reader | FileReader | BufferedReader |
Writer | FileWriter | BufferedWriter |
java.io常用類
JDK所提供的所有流類位于
java.io
包中,都分别繼承自以下四種抽象流類。
InputStream: 繼承自InputStream的流都是用于向程式中輸入資料的,且資料機關都是位元組(8位)。
OutputStream: 繼承自OutputStream的流都是程式用于向外輸出資料的,且資料機關都是位元組(8位)。
Reader: 繼承自Reader的流都是用于向程式中輸入資料的,且資料機關都是字元(16位)。
Writer: 繼承自Writer的流都是程式用于向外輸出資料的,且資料機關都是字元(16位)。
File: 是檔案和目錄路徑名的抽象表示,主要用于檔案和目錄的建立、查找和删除等操作。專門對檔案進行操作的類,隻能對檔案本身進行操作,不能對檔案内容進行操作。
Java輸入輸出流體系中常用流分類圖:
Java中IO與NIO
Java.io
是大多數面向資料流的輸入/輸出類的主要軟體包。
此外,Java也對塊傳輸提供支援,在核心庫
java.nio
中采用的便是塊IO。
Java IO與NIO之間的主要差别
- 面向流與面向緩沖:Java IO面向流,Java NIO面向緩沖。
分析:
Java IO面向流意味着每次從流中讀一個或多個位元組,直至讀取所有位元組,它們沒有被緩存在任何地方。此外,它不能前後移動流中的資料。如果需要前後移動從流中讀取的資料,需要先将它緩存到一個緩沖區。
Java NIO将資料先讀取到一個它稍後處理的緩沖區,需要時可在緩沖區中前後移動。這就增加了處理過程中的靈活性。但是,還需要檢查是否該緩沖區中包含所有需要處理的資料。而且,需確定當更多的資料讀入緩沖區時,不要覆寫緩沖區裡尚未處理的資料。
- 阻塞與非阻塞IO:Java IO的各種流是阻塞的,Java NIO的非阻塞模式。
分析:
Java IO的各種流是阻塞的。這意味着,當一個線程調用read() 或 write()時,該線程被阻塞,直到有一些資料被讀取,或資料完全寫入。該線程在此期間不能再幹任何事情了。
Java NIO的非阻塞模式,如果通道沒有東西可讀,或不可寫,讀寫函數馬上傳回,而不會阻塞,這個線程可以去做别的事情。線程通常将非阻塞IO的空閑時間用于在其它通道上執行IO操作,是以一個單獨的線程可以管理多個輸入和輸出通道(channel),即IO多路複用的原理。
- 選擇器(Selectors)
分析:
Java NIO的選擇器允許一個單獨的線程來監視多個輸入通道,你可以注冊多個通道使用一個選擇器,然後使用一個單獨的線程來“選擇”通道:這些通道裡已經有可以處理的輸入,或者選擇已準備寫入的通道。這種選擇機制,使得一個單獨的線程很容易來管理多個通道。
JavaIO流的用處
1. 磁盤IO
磁盤IO主要是指對檔案的操作以及檔案内容的操作。
2. 網絡IO
網絡程式設計的基本模型是C/S模型,即兩個程序間的通信。
服務端提供IP和監聽端口,用戶端通過連接配接操作向服務端監聽的位址發起連接配接請求,通過三次握手連接配接,如果連接配接成功建立,雙方就可以通過套接字進行通信。 通信的方式就是指網絡IO。
JDK1.7之後有網絡程式設計模型:
- BIO
- NIO
- AIO
BIO(傳統的同步阻塞模型)開發中,ServerSocket負責綁定IP位址,啟動監聽端口;Socket負責發起連接配接操作。連接配接成功後,雙方通過輸入和輸出流(網絡IO)進行同步阻塞式通信。
NIO提供了與傳統BIO模型中的Socket和ServerSocket相對應的SocketChannel和ServerSocketChannel兩種不同的套接字通道實作。
AIO(NIO 2.0)引入了新的異步通道的概念,并提供了異步檔案通道和異步套接字通道的實作。異步的套接字通道時真正的異步非阻塞I/O,對應于UNIX網絡程式設計中的事件驅動I/O(AIO)。AIO不需要過多的Selector對注冊的通道進行輪詢即可實作異步讀寫,進而簡化了NIO的程式設計模型。