1.java.io的描述
通過數(shù)據(jù)流、序列化和文件系統(tǒng)提供系統(tǒng)輸入和輸出。
2.流編輯
流是一個(gè)很形象的概念,當(dāng)程序需要讀取數(shù)據(jù)的時(shí)候,就會(huì)開啟一個(gè)通向數(shù)據(jù)源的流,這個(gè)數(shù)據(jù)源可以是文件,內(nèi)存,或是網(wǎng)絡(luò)連接。類似的,當(dāng)程序需要寫入數(shù)據(jù)的時(shí)候,就會(huì)開啟一個(gè)通向目的地的流。這時(shí)候你就可以想象數(shù)據(jù)好像在這其中“流”動(dòng)一樣。
3.Java流輸入輸出原理編輯
Java把這些不同來源和目標(biāo)的數(shù)據(jù)都統(tǒng)一抽象為數(shù)據(jù)流。Java語(yǔ)言的輸入輸出功能是十分強(qiáng)大而靈活的,美中不足的是看上去輸入輸出的代碼并不是很簡(jiǎn)潔,因?yàn)槟阃枰b許多不同的對(duì)象。
在Java類庫(kù)中,IO部分的內(nèi)容是很龐大的,因?yàn)樗婕暗念I(lǐng)域很廣泛:標(biāo)準(zhǔn)輸入輸出,文件的操作,網(wǎng)絡(luò)上的數(shù)據(jù)流,字符串流,對(duì)象流,zip文件流。
4.Java流的分類
按流向分:
- 輸入流:程序可以從中讀取數(shù)據(jù)的流。
- 輸出流:程序能向其中寫入數(shù)據(jù)的流。
按數(shù)據(jù)傳輸單位分:
- 字節(jié)流:以字節(jié)為單位傳輸數(shù)據(jù)的流
- 字符流:以字符為單位傳輸數(shù)據(jù)的流
按功能分:
- 節(jié)點(diǎn)流:用于直接操作目標(biāo)設(shè)備的流
- 過濾流:是對(duì)一個(gè)已存在的流的鏈接和封裝,通過對(duì)數(shù)據(jù)進(jìn)行處理為程序提供功能強(qiáng)大、靈活的讀寫功能。
java.io常用類
- JDK所提供的所有流類位于java.io包中,都分別繼承自以下四種抽象流類。
- InputStream:繼承自InputStream的流都是用于向程序中輸入數(shù)據(jù)的,且數(shù)據(jù)單位都是字節(jié)(8位)。
- OutputStream:繼承自O(shè)utputStream的流都是程序用于向外輸出數(shù)據(jù)的,且數(shù)據(jù)單位都是字節(jié)(8位)。
- Reader:繼承自Reader的流都是用于向程序中輸入數(shù)據(jù)的,且數(shù)據(jù)單位都是字符(16位)。
- Writer:繼承自Writer的流都是程序用于向外輸出數(shù)據(jù)的,且數(shù)據(jù)單位都是字符(16位)。
5.IO的基本分類
Java的I/O操作類在包java.io下,大概有將近80個(gè)類,但是這些類大概可以分成四組,分別是:
- 基于字節(jié)操作的I/O接口:InputStream和OutputStream
- 基于字符操作的I/O接口:Writer和Reader
- 基于磁盤操作的I/O接口:File
- 基于網(wǎng)絡(luò)操作的I/O接口:Socket編程
6.磁盤I/O工作機(jī)制
前面介紹了基本的JavaI/O的操作接口,這些接口主要定義了如何操作數(shù)據(jù),以及介紹了操作兩種數(shù)據(jù)結(jié)構(gòu):字節(jié)和字符的方式。還有一個(gè)關(guān)鍵問題就是數(shù)據(jù)寫到何處,其中一個(gè)主要方式就是將數(shù)據(jù)持久化到物理磁盤,下面將介紹如何將數(shù)據(jù)持久化到物理磁盤的過程。
我們知道數(shù)據(jù)在磁盤的唯一最小描述就是文件,也就是說上層應(yīng)用程序只能通過文件來操作磁盤上的數(shù)據(jù),文件也是操作系統(tǒng)和磁盤驅(qū)動(dòng)器交互的一個(gè)最小單元。值得注意的是Java中通常的File并不代表一個(gè)真實(shí)存在的文件對(duì)象,當(dāng)你通過指定一個(gè)路徑描述符時(shí),它就會(huì)返回一個(gè)代表這個(gè)路徑相關(guān)聯(lián)的一個(gè)虛擬對(duì)象,這個(gè)可能是一個(gè)真實(shí)存在的文件或者是一個(gè)包含多個(gè)文件的目錄。為何要這樣設(shè)計(jì)?因?yàn)榇蟛糠智闆r下,我們并不關(guān)心這個(gè)文件是否真的存在,而是關(guān)心這個(gè)文件到底如何操作。例如我們手機(jī)里通常存了幾百個(gè)朋友的電話號(hào)碼,但是我們通常關(guān)心的是我有沒有這個(gè)朋友的電話號(hào)碼,或者這個(gè)電話號(hào)碼是什么,但是這個(gè)電話號(hào)碼到底能不能打通,我們并不是時(shí)時(shí)刻刻都去檢查,而只有在真正要給他打電話時(shí)才會(huì)看這個(gè)電話能不能用。也就是使用這個(gè)電話記錄要比打這個(gè)電話的次數(shù)多很多。
何時(shí)真正會(huì)要檢查一個(gè)文件存不存?就是在真正要讀取這個(gè)文件時(shí),例如FileInputStream類都是操作一個(gè)文件的接口,注意到在創(chuàng)建一個(gè)FileInputStream對(duì)象時(shí),會(huì)創(chuàng)建一個(gè)FileDescriptor對(duì)象,其實(shí)這個(gè)對(duì)象就是真正代表一個(gè)存在的文件對(duì)象的描述,當(dāng)我們?cè)诓僮饕粋€(gè)文件對(duì)象時(shí)可以通過getFD()方法獲取真正操作的與底層操作系統(tǒng)關(guān)聯(lián)的文件描述。例如可以調(diào)用FileDescriptor.sync()方法將操作系統(tǒng)緩存中的數(shù)據(jù)強(qiáng)制刷新到物理磁盤中。
以上就是北大青鳥長(zhǎng)沙麓谷校區(qū)java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“技術(shù)分析,Java開發(fā)接口之IO接口”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問,請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。