天天看點

Java基礎-IO流-概述

Java工程師知識樹 / Java基礎

文章目錄

        • IO與流的概念:
        • java.io包
        • java.io包下流的分類
          • 按流向分:
          • 按資料傳輸機關分:
          • 按功能分:
        • java.io常用類
        • Java中IO與NIO
          • Java IO與NIO之間的主要差别
          • JavaIO流的用處

IO與流的概念:

IO:I/O是Input/Output的縮寫, I/O技術是非常實用的技術, 用于處理裝置之間的資料傳輸。

流:流是用來讀寫資料的。當程式需要讀取資料的時候,就會開啟一個通向資料源的流,這個資料源可以是檔案,記憶體,或是網絡連接配接。類似的,當程式需要寫入資料的時候,就會開啟一個通向目的地的流。這時候你就可以想象資料好像在這其中“流”動一樣。從流中取得資料的操作稱為提取操作(輸出),而向流中添加資料的操作稱為插入操作(輸入)。

java.io包

Java把不同來源和目标的資料都統一抽象為資料流。

Java基礎-IO流-概述

JavaIO原理:Java中IO是以資料流為基礎進行輸入輸出的,所有資料被串行化寫入輸出流,或者從輸入流讀入。

在Java類庫中,IO操作包括:輸入輸出流,檔案的操作,網絡傳輸資料流,字元串流,對象流,zip檔案流。

Java的IO包作用的描述: 通過資料流,序列号和檔案系統提供系統輸入和輸出。

從功能上區分在Java類庫中包含三個部分:

  1. 流式部分――IO的主體部分,如:InputStream、OutputStream、Writer、Reader等;
  2. 非流式部分――主要包含一些輔助流式部分的類,如:File類、RandomAccessFile類和FileDescriptor等類;

    java.io.File類是檔案和目錄路徑名的抽象表示,并且java.io.File類的執行個體可以表示檔案系統的對象,例如檔案或目錄。是以JDK将java.io.File類放到了java.io包下。

  3. 其他類――檔案讀取部分的與安全相關的類,如:SerializablePermission類,以及與本地作業系統相關的檔案系統的類,如:FileSystem類和Win32FileSystem類和WinNTFileSystem類。

java.io包下流的分類

按流向分:

輸入流: 程式可以從中讀取資料的流。特點:能夠向輸入流中添加資料

輸出流: 程式能向其中寫入資料的流。特點:能夠從輸出流中取得資料

以InputStream、OutputStream作為抽象基類。輸入流和輸出流都是站在程式的角度上來說。

描述 位元組流(抽象基類) 字元流(抽象基類)
輸入流 InputStream Reader
輸出流 OutputStream Writer
按資料傳輸機關分:

位元組流: 以位元組為機關傳輸資料的流

字元流: 以字元為機關傳輸資料的流

以Writer、Reader作為抽象基類。

位元組流和字元流選擇

  • 位元組流: 位元組流讀取的時候,讀到一個位元組就傳回一個位元組; 主要用于讀取圖檔,MP3,AVI視訊檔案。
  • 字元流: 字元流使用了位元組流讀到一個或多個位元組,如讀取中文時,就會一次讀取2個位元組。隻要是處理純文字資料,就要優先考慮使用字元流。
描述 位元組流(抽象基類) 字元流(抽象基類)
輸入流 InputStream Reader
輸出流 OutputStream Writer
按功能分:

位元組流: 用于直接操作目标裝置的流

過濾流: 是對一個已存在的流的連結和封裝,通過對資料進行處理為程式提供功能強大、靈活的讀寫功能。

抽象基類 節點流(檔案流) 緩沖流(處理流的一種)
InputStream FileInputStream BufferedInputStream
OutputStream FileOutputStream BufferedOutputStream
Reader FileReader BufferedReader
Writer FileWriter BufferedWriter

java.io常用類

JDK所提供的所有流類位于

java.io

包中,都分别繼承自以下四種抽象流類。

InputStream: 繼承自InputStream的流都是用于向程式中輸入資料的,且資料機關都是位元組(8位)。

OutputStream: 繼承自OutputStream的流都是程式用于向外輸出資料的,且資料機關都是位元組(8位)。

Reader: 繼承自Reader的流都是用于向程式中輸入資料的,且資料機關都是字元(16位)。

Writer: 繼承自Writer的流都是程式用于向外輸出資料的,且資料機關都是字元(16位)。

File: 是檔案和目錄路徑名的抽象表示,主要用于檔案和目錄的建立、查找和删除等操作。專門對檔案進行操作的類,隻能對檔案本身進行操作,不能對檔案内容進行操作。

Java輸入輸出流體系中常用流分類圖:

Java基礎-IO流-概述

Java中IO與NIO

Java.io

是大多數面向資料流的輸入/輸出類的主要軟體包。

此外,Java也對塊傳輸提供支援,在核心庫

java.nio

中采用的便是塊IO。

Java IO與NIO之間的主要差别
  1. 面向流與面向緩沖:Java IO面向流,Java NIO面向緩沖。

分析:

​ Java IO面向流意味着每次從流中讀一個或多個位元組,直至讀取所有位元組,它們沒有被緩存在任何地方。此外,它不能前後移動流中的資料。如果需要前後移動從流中讀取的資料,需要先将它緩存到一個緩沖區。

​ Java NIO将資料先讀取到一個它稍後處理的緩沖區,需要時可在緩沖區中前後移動。這就增加了處理過程中的靈活性。但是,還需要檢查是否該緩沖區中包含所有需要處理的資料。而且,需確定當更多的資料讀入緩沖區時,不要覆寫緩沖區裡尚未處理的資料。

  1. 阻塞與非阻塞IO:Java IO的各種流是阻塞的,Java NIO的非阻塞模式。

分析:

​ Java IO的各種流是阻塞的。這意味着,當一個線程調用read() 或 write()時,該線程被阻塞,直到有一些資料被讀取,或資料完全寫入。該線程在此期間不能再幹任何事情了。

​ Java NIO的非阻塞模式,如果通道沒有東西可讀,或不可寫,讀寫函數馬上傳回,而不會阻塞,這個線程可以去做别的事情。線程通常将非阻塞IO的空閑時間用于在其它通道上執行IO操作,是以一個單獨的線程可以管理多個輸入和輸出通道(channel),即IO多路複用的原理。

  1. 選擇器(Selectors)

分析:

​ Java NIO的選擇器允許一個單獨的線程來監視多個輸入通道,你可以注冊多個通道使用一個選擇器,然後使用一個單獨的線程來“選擇”通道:這些通道裡已經有可以處理的輸入,或者選擇已準備寫入的通道。這種選擇機制,使得一個單獨的線程很容易來管理多個通道。

JavaIO流的用處

1. 磁盤IO

磁盤IO主要是指對檔案的操作以及檔案内容的操作。

2. 網絡IO

網絡程式設計的基本模型是C/S模型,即兩個程序間的通信。

服務端提供IP和監聽端口,用戶端通過連接配接操作向服務端監聽的位址發起連接配接請求,通過三次握手連接配接,如果連接配接成功建立,雙方就可以通過套接字進行通信。 通信的方式就是指網絡IO。

JDK1.7之後有網絡程式設計模型:

  1. BIO
  2. NIO
  3. AIO

BIO(傳統的同步阻塞模型)開發中,ServerSocket負責綁定IP位址,啟動監聽端口;Socket負責發起連接配接操作。連接配接成功後,雙方通過輸入和輸出流(網絡IO)進行同步阻塞式通信。

NIO提供了與傳統BIO模型中的Socket和ServerSocket相對應的SocketChannel和ServerSocketChannel兩種不同的套接字通道實作。

AIO(NIO 2.0)引入了新的異步通道的概念,并提供了異步檔案通道和異步套接字通道的實作。異步的套接字通道時真正的異步非阻塞I/O,對應于UNIX網絡程式設計中的事件驅動I/O(AIO)。AIO不需要過多的Selector對注冊的通道進行輪詢即可實作異步讀寫,進而簡化了NIO的程式設計模型。