Java的IO流是實現輸入/輸出的基礎,它可以方便實現資料的輸入/輸出操作,並在Java中將不同的輸入/輸出來源抽象表述為"流"。
流是一組有順序的位元組集合,是資料傳輸的總稱或抽象。
流有輸入和輸出,輸入時是流從資料來源流向程式。輸出時是流從程式傳向資料來源,而資料來源可以是內存,文件,網路或程式等。
使用者行程與作業系統核心
#Java 中的IO可以理解為是在Java程式和作業系統核心兩個對象之間進行的。
後面所說的阻塞和非阻塞,同步和非同步都是這兩個物件互動的結果。在本文中,使用者流程指的就是Java程式。
程式空間與核心空間
Waiting for the data to be ready(等待資料到達核心緩衝區)
Copying the data from the kernel to the process(從核心緩衝區拷貝資料到程式緩衝區)
在Linux中,對於一次讀取IO的操作,資料並不會直接拷貝到程式的程式緩衝區。
它首先會被拷貝到作業系統核心的緩衝區中,然後才會從作業系統核心的緩衝區拷貝到應用程式的緩衝區。
程式空間:分配給使用者程式的記憶體空間。
核心空間:核心擁有的記憶體空間。
阻塞與非阻塞
阻塞:使用者行程進行系統呼叫後,使用者行程一直處於鎖定的狀態,不能進行其他動作
#阻塞:使用者程序進行系統呼叫後,使用者程序沒有被鎖定,可以進行其他操作
阻塞和非阻塞說的是使用者程序的狀態,也就是使用者程序是否被鎖定
#同步與非同步
A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes.
An asynchronous I/O operation does not cause the requesting process to be blocked.
一個同步的io操作會導致發起請求的程序阻塞直到這個io操作完成。一個非同步的io操作不會導致請求的執行緒被阻塞。
同步:用戶執行緒和io執行緒做同一件事(用戶執行緒被阻塞,等待內核返回處理結果)
非同步:用戶執行緒和io執行緒做不同的事情(用戶執行緒不被阻塞,做其他的事情,內核處理完成發送結果給用戶線程)
檔案描述子
在Linux下面一切皆檔案。文件描述符(file descriptor)是核心為文件所建立的索引,所有I/O操作都透過呼叫檔案描述符(索引)來執行,包括下面我們要提到的socket。 Linux剛啟動的時候會自動設定0是標準輸入,1是標準輸出,2是標準錯誤。
以上是java io為什麼重要的詳細內容。更多資訊請關注PHP中文網其他相關文章!