1. 程式人生 > >輸入/輸出

輸入/輸出

png 水龍頭 是個 卻又 08-18 管道 數據源 red 相同

引言:

對一段看不到明顯運行效果的代碼,是比較乏味的,但是輸入/輸出卻又是每個程序都必須要的。Java的IO通過java.io包下的類和接口來支持,在java.io包下主要包括輸入、輸出兩種IO流,每種輸入、輸出流又可分為字節流和字符流兩大類。除此之外,Java的IO流使用了一種裝飾器設計模式,將IO流分成底層節點流和上層處理流。Java7在java.nio及其子包下提供了一系列全新的API,這些API對原有的IO進行了升級,因此也被稱為NIO2,使程序更加高效

1.File類

File類是java.io包下代表與平臺無關的文件和目錄,換一句話說就是如果希望在程序中操作文件和目錄,都可以通過File類來完成。但是訪問文件內容本身,要通過輸入/輸出流

1)訪問文件和目錄

File類可以使用文件路徑字符串來創建File實例,該文件路徑字符字符創既可以是絕對路徑,也可以是相對路徑。在默認情況下,系統總會依據運行JVM時所在的路徑來解釋相對路徑。

訪問文件名相關的方法:

技術分享

文件檢測相關的方法:

技術分享

獲取常規文件信息:

技術分享

文件操作相關方法:

技術分享

目錄操作相關的方法:

技術分享

2)文件過濾器

2.理解Java的IO流

java的IO流是實現輸入/輸出的基礎,那麽什麽是“流”呢,流是個抽象的概念,是對輸入輸出設備的抽象,當程序需要從某個數據源讀入數據的時候,就會開啟一個數據流,數據源可以是文件、內存或網絡等等。相反地,需要寫出數據到某個數據源目的地的時候,也會開啟一個數據流,這個數據源目的地也可以是文件、內存或網絡等等。

技術分享

流具有方向性,至於是輸入流還是輸出流則是一個相對的概念,一般以程序為參考,如果數據的流向是程序至設備,我們成為輸出流,反之我們稱為輸入流。

可以將流想象成一個“水流管道”,水流就在這管道中形成了,自然就出現了方向的概念。

這個時候,你就可以想象數據好像在其中流動一樣,如下圖:

技術分享

你可以將流想象成一個“水流管道”,水流就在這管道中形成了,自然就出現了方向的概念,水可以流進也可以流出。當水從一處流進管道的時候,就相當於從數據源讀入數據至流中,當水從管道流到某處的時候,就相當於從流中寫出數據到某個數據源目的地。
剛剛說到流有方向的概念,在Java中將讀入數據的流叫做輸入流,將寫出數據的流叫做輸出流。

當程序需要從某個數據源讀入數據的時候,就會開啟一個輸入流,數據源可以是文件、內存或網絡等等。相反地,需要寫出數據到某個數據源目的地的時候,也會開啟一個輸出流,這個數據源目的地也可以是文件、內存或網絡等等。

流就是一個運水的管子,裏面的水可以是字符串,可以是二進制文件,聲明輸入流就相當於是你把這根管子接到了某個水龍頭上,聲明輸出流就相當於你拿著管子往哪澆水,關流等於是把管子拆下來收好,用裝飾設計模式(比如加buffer)就相當於因為你家水龍頭反正本來水流就不大,於是你在管子上裝了一個儲水泵,每當這個儲水泵的水滿了,它會一次性的把水打出來。

1) 流的分類

按照流向來分:輸入流(只能從中讀取數據,不能向其寫入數據)使用InpurtStream和Reader作為基類、輸出流(只能向其寫入數據,不能從中讀取數據)使用OutputStream和Writer作為基類。

這裏的方向理解起來應該是對於不同的對象不同,比如A給B一個蘋果,對於A來說應該使用輸出流,而對於B來說應該使用輸入流。但是劃分輸入/輸出流時是從程序運行的內存的角度來考慮

按照操作的數據單元來分:字節流(操作的數據單元是8位的字節)使用InpurtStream和OutputStream作為基類、字符流(數據單元是16位的字符)使用Reader和Writer作為基類

按照角色來分 :節點流(可以從/向一個特定的IO設備讀/寫數據的流)。節點流從一個特定的數據源讀寫數據。即節點流是直接操作文件,網絡等的流,例如FileInputStream和FileOutputStream,他們直接從文件中讀取或往文件中寫入字節流。

技術分享

處理流(過濾流)(用於對一個已存在的流進行連接或封裝,通過封裝後的流來實現數據讀/寫功能)

當使用處理流進行輸入/輸出時,程序並不會直接連接到實際的數據源,沒有和實際的輸入/輸出節點連接。

技術分享

技術分享

通過使用處理流,程序無須理會輸入/輸出節點是啥,只要將這些節點流包裝成處理流,就可以使用相同的輸入輸出代碼來讀寫不同的輸入/輸出設備的數據

輸入/輸出