輸入/輸出
引言:
對一段看不到明顯運行效果的代碼,是比較乏味的,但是輸入/輸出卻又是每個程序都必須要的。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,他們直接從文件中讀取或往文件中寫入字節流。
處理流(過濾流)(用於對一個已存在的流進行連接或封裝,通過封裝後的流來實現數據讀/寫功能)
當使用處理流進行輸入/輸出時,程序並不會直接連接到實際的數據源,沒有和實際的輸入/輸出節點連接。
通過使用處理流,程序無須理會輸入/輸出節點是啥,只要將這些節點流包裝成處理流,就可以使用相同的輸入輸出代碼來讀寫不同的輸入/輸出設備的數據
輸入/輸出