「JAVA」何謂“IO”,何謂“流”,Java 中的IO、流體系如何實現


「JAVA」何謂“IO”,何謂“流”,Java 中的IO、流體系如何實現

Java IO

什麼是IO

什麼是IO,其實就是輸入(Input)、輸出(Output)。所以在平時所講的IO設備,其實也就是與電腦通過輸入、輸出信號完成通信的設備。

  • 輸入設備:可傳輸數據到電腦的設備;比如:麥克風、掃描器、鍵盤、鼠標等;
  • 輸出設備:可接收電腦輸出的數據,並對數據做一些處理的設備;比如:顯示器、打印機、投影儀、耳機、音響等;

IO在程序中也有著很高的應用,比如:遊戲進度的存儲、微信聊天記錄、在線視頻和資源、雲文件等環境中都是IO的主戰場。


在編程語言中經常會使用“流”這個抽象概念來表示語言的IO語言庫,“流”既能表示能夠輸出數據的數據源對象,也能表示能夠接收數據的接收端對象。“流”作為IO語言庫中的核心軸,它封裝了實際的IO設備處理數據的細節。

在理解“流”的時候,可以將“流”與“水流”聯繫起來,就比較好理解了。水流通過管道就可以從水井流動到水缸和鍋中,站在水缸的角度來看

水井是水源,也就是輸入源,水從水井通過輸入管道到達水缸,對水缸來說就是輸入;而鍋是接收端,水缸中的水通過輸出管道進入鍋中,對於水缸來說就是輸出。

「JAVA」何謂“IO”,何謂“流”,Java 中的IO、流體系如何實現

可以把“流”比作管道中流動的水

同樣的,在程序當中,也是一樣的道理:字節/字符數據通過流對象在輸入、輸出管道中傳輸,字節/字符數據從數據源通過輸入管道傳輸到程序中,對程序來說是輸入;字節/字符數據從程序中通過輸出管道傳輸到接收端中,對程序來說就是輸出。


Java 中的IO

Java中的IO同樣也有輸入、輸出兩個部分,可分為輸入模式輸出模式

「JAVA」何謂“IO”,何謂“流”,Java 中的IO、流體系如何實現

輸入模式和輸出模式

Java 中的IO流根據使用場景的不同的分類,站在不同的角度,有何不同的分類:

  1. 根據流向劃分: 輸入流輸出流
  2. 根據數據的單位劃分:字節流字符流
  3. 根據功能的劃分:節點流包裝流
  4. 四大基礎流:字節輸出流字節輸入流字符輸出流字符輸入流

四大基礎流

在Java中提供了四大基礎流:字節輸出流字節輸入流字符輸出流字符輸入流;四大基礎流都是抽象類,因此不能創建四大基礎流的對象,只能創建其子類對象;Java IO中的其他流都是繼承於四大基礎流的,但是無論是什麼流,都有提供close方法用來關閉資源。

為什麼要關閉資源呢?因為如果操作資源文件,會創建一個流對象關聯相應的資源文件,使該文件處於使用中;如果不關閉資源,那麼該文件會一直被程序引用著,既不能刪除,也不能更改;這樣對系統的資源會是一個不小的損耗。

「JAVA」何謂“IO”,何謂“流”,Java 中的IO、流體系如何實現

四大基礎流

任何繼承於InputStream或者Reader的類都是輸入流,都會有read() 方法,用於讀取單個字節或者字節數組的數據;同樣的,任何繼承於OutputStream或者Writer的類都是輸出流,都會有write() 方法,用於寫單個字節或者字節數組的數據到文件中。

所以,Java中的流體系都是以InputStream和OutputStream、Reader和Writer拓展開來的。

「JAVA」何謂“IO”,何謂“流”,Java 中的IO、流體系如何實現

InputStream / OutputStream 流體系


「JAVA」何謂“IO”,何謂“流”,Java 中的IO、流體系如何實現

Reader 和 Writer 流體系


操作IO流的完整過程:(穿插水流的案例來說明)

1.創建輸入源或者輸出的目標對象,如同水流案例中的挖井,解決的是水源的問題;

  • 輸入操作:把文件中的數據流向到程序中,此時文件是源,程序是目標,對於文件來說是輸出,對於程序來說是輸入;
  • 輸出操作:把程序中的數據流向到文件中,此時文件是目標,程序是源,對於文件來說是輸入,對於程序來說,是輸出;

2.創建IO流對象,用於傳輸數據,就如同水流案例中的管道,提供水流輸送的路徑和方法;

  • 輸入操作: 創建輸入流對象。
  • 輸出操作: 創建輸出流對象。

3.具體的IO操作,如何操作流中的數據,是讀取,還是寫出;就如同水流案例中的取水和蓄水;

  • 輸入操作:輸入流對象的read方法。
  • 輸出操作:輸出流對象的write方法。

4.關閉資源(必須的操作),資源使用完畢後,必須關閉其對應的流對象;一旦資源關閉後,就不能使用對應的流對象了;就如同水流使用完畢後,必須關閉水源,防止浪費,節約資源;

  • 輸入操作:輸入流對象.close()。
  • 輸出操作:輸出流對象.close()。


所以在操作IO流時,對於程序來說,是讀進來、寫出去;

  • 讀進來:強調的是輸入,其執行的是read方法;
  • 寫出去:強調的是輸出,其執行的是write方法;


完結。老夫雖不正經,但老夫一身的才華


分享到:


相關文章: