什麼是IO
什麼是IO,其實就是輸入(Input)、輸出(Output)。所以在平時所講的IO設備,其實也就是與電腦通過輸入、輸出信號完成通信的設備。
- 輸入設備:可傳輸數據到電腦的設備;比如:麥克風、掃描器、鍵盤、鼠標等;
- 輸出設備:可接收電腦輸出的數據,並對數據做一些處理的設備;比如:顯示器、打印機、投影儀、耳機、音響等;
IO在程序中也有著很高的應用,比如:遊戲進度的存儲、微信聊天記錄、在線視頻和資源、雲文件等環境中都是IO的主戰場。
流
在編程語言中經常會使用“流”這個抽象概念來表示語言的IO語言庫,“流”既能表示能夠輸出數據的數據源對象,也能表示能夠接收數據的接收端對象。“流”作為IO語言庫中的核心軸,它封裝了實際的IO設備處理數據的細節。
在理解“流”的時候,可以將“流”與“水流”聯繫起來,就比較好理解了。水流通過管道就可以從水井流動到水缸和鍋中,站在水缸的角度來看:
水井是水源,也就是輸入源,水從水井通過輸入管道到達水缸,對水缸來說就是輸入;而鍋是接收端,水缸中的水通過輸出管道進入鍋中,對於水缸來說就是輸出。
同樣的,在程序當中,也是一樣的道理:字節/字符數據通過流對象在輸入、輸出管道中傳輸,字節/字符數據從數據源通過輸入管道傳輸到程序中,對程序來說是輸入;字節/字符數據從程序中通過輸出管道傳輸到接收端中,對程序來說就是輸出。
Java 中的IO
Java中的IO同樣也有輸入、輸出兩個部分,可分為輸入模式、輸出模式:
Java 中的IO流根據使用場景的不同的分類,站在不同的角度,有何不同的分類:
- 根據流向劃分: 輸入流和輸出流;
- 根據數據的單位劃分:字節流和字符流;
- 根據功能的劃分:節點流和包裝流;
- 四大基礎流:字節輸出流、字節輸入流、字符輸出流、字符輸入流;
四大基礎流:
在Java中提供了四大基礎流:字節輸出流、字節輸入流、字符輸出流、字符輸入流;四大基礎流都是抽象類,因此不能創建四大基礎流的對象,只能創建其子類對象;Java IO中的其他流都是繼承於四大基礎流的,但是無論是什麼流,都有提供close方法用來關閉資源。
為什麼要關閉資源呢?因為如果操作資源文件,會創建一個流對象關聯相應的資源文件,使該文件處於使用中;如果不關閉資源,那麼該文件會一直被程序引用著,既不能刪除,也不能更改;這樣對系統的資源會是一個不小的損耗。
任何繼承於InputStream或者Reader的類都是輸入流,都會有read() 方法,用於讀取單個字節或者字節數組的數據;同樣的,任何繼承於OutputStream或者Writer的類都是輸出流,都會有write() 方法,用於寫單個字節或者字節數組的數據到文件中。
所以,Java中的流體系都是以InputStream和OutputStream、Reader和Writer拓展開來的。
操作IO流的完整過程:(穿插水流的案例來說明)
1.創建輸入源或者輸出的目標對象,如同水流案例中的挖井,解決的是水源的問題;
- 輸入操作:把文件中的數據流向到程序中,此時文件是源,程序是目標,對於文件來說是輸出,對於程序來說是輸入;
- 輸出操作:把程序中的數據流向到文件中,此時文件是目標,程序是源,對於文件來說是輸入,對於程序來說,是輸出;
2.創建IO流對象,用於傳輸數據,就如同水流案例中的管道,提供水流輸送的路徑和方法;
- 輸入操作: 創建輸入流對象。
- 輸出操作: 創建輸出流對象。
3.具體的IO操作,如何操作流中的數據,是讀取,還是寫出;就如同水流案例中的取水和蓄水;
- 輸入操作:輸入流對象的read方法。
- 輸出操作:輸出流對象的write方法。
4.關閉資源(必須的操作),資源使用完畢後,必須關閉其對應的流對象;一旦資源關閉後,就不能使用對應的流對象了;就如同水流使用完畢後,必須關閉水源,防止浪費,節約資源;
- 輸入操作:輸入流對象.close()。
- 輸出操作:輸出流對象.close()。
所以在操作IO流時,對於程序來說,是讀進來、寫出去;
- 讀進來:強調的是輸入,其執行的是read方法;
- 寫出去:強調的是輸出,其執行的是write方法;
完結。老夫雖不正經,但老夫一身的才華