天天看點

java--BIO、NIO、AIOjava 的IO是什麼?JAVA IO 的三種類型

java 的IO是什麼?

Java程式中,對于資料的輸入/輸出操作 都是以“流”的方式進行的,java io就是用來進行資料的操作的。

JAVA IO 的三種類型

同步阻塞的BIO

同步非阻塞的NIO

異步非阻塞的AIO

同步 : 使用同步IO時,Java自己處理IO讀寫。

異步 :使用異步IO時,Java将IO讀寫委托給OS處理,需要将資料緩沖區位址和大小傳給OS,OS需要支援異步IO操作API。

阻塞 :使用阻塞IO時,Java調用會一直阻塞到讀寫完成才傳回。

非阻塞 : 使用非阻塞IO時,如果不能讀寫Java調用會馬上傳回,當IO事件分發器會通知可讀寫時再繼續進行讀寫,不斷循環直到讀寫完成。

1.BIO(同步阻塞)

當對一個資料源進行IO操作時,其他操作流都不能對這個資料源進行操作,必須等操作完,其他操作流才能對該資料進行操作。

為什麼是同步阻塞?

它其實就是服務端建立一個ServerSocket, 然後就是用戶端用一個Socket去連接配接服務端的那個ServerSocket, ServerSocket接收到了一個的連接配接請求就建立一個Socket和一個線程去跟那個Socket進行通訊。接着用戶端和服務端就進行阻塞式的通信,用戶端發送一個請求,服務端Socket進行處理後傳回響應。

每次一個用戶端接入,都需要在服務端建立一個線程來服務這個用戶端

java--BIO、NIO、AIOjava 的IO是什麼?JAVA IO 的三種類型

(1)位元組流 讀取單個位元組(Stream結尾的都是)

輸入流InputStream:從外部資料源讀取資料到程式内部。

輸出流OutputStrem:從程式輸出資料到外部資料源

input 與output值得是相對于程式而言。input是從檔案讀取進來,output是輸出到檔案

Inputstream(輸入流)

ByteArrayInputstream (數組操作)

PipedInputStream(管道操作)

FilterInputStream(過濾輸入流,對位元組流進行裝飾)

BufferedInputStream(帶有緩沖的位元組流操作)

DataInputStream(基本資料類型操作)

FileInputStream (檔案操作)

ObjectInputStream(對象操作,序列化)

outputstream(輸出流)

ByteArrayOutputStream(數組操作)

PipedOutputStream(管道操作)

FilterOutputStream(過濾輸出流,對位元組流進行裝飾)

BufferedOutputStream(帶有緩沖的位元組流操作)

DataOutputStream(基本資料類型操作)

PrintStream(列印)

FileOutputStream(檔案操作)

ObjectOutputStrem(對象操作,反序列化)

(2)字元流 讀取單個字元 (Reader,Wirter 結尾的都是字元流)

Reader(輸入流)

CharArrayReader(數組操作)

PipedReader(管道操作)

FilterReader(過濾流,對字元流進行裝飾)

BufferedReader(帶有緩沖的字元流操作)

InputStreamReader(轉換流)

FileReader(檔案操作)

Wirter(輸出流)

CharArrayWirter(數組操作)

PipedWirter(管道操作)

FilterWirter(過濾流,對字元流進行裝飾)

BufferedWriter(帶有緩沖的字元流操作)

OutputStreamWriter(轉換流)

FileWriter (檔案操作)

PrintWriter(列印)

代碼樣例:檔案操作流對檔案的簡單操作

讀取文本文檔的内容

package file;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class BIO {
    public static void  main (String args[]) throws IOException {
        //根據指定路徑建立一個檔案句柄
        File file =new File( "C:\\Users\\Lenovo\\Desktop\\hello.txt");
        FileInputStream fis = null;
        try {
          //打開此檔案的操作流程
            fis = new FileInputStream(file);
            byte[] bytearr = new byte[128];
         //讀取指定長度的資料
            fis. read(bytearr);
            String str = new String (bytearr);
            System.out.println(str);
            
		 //打開輸出流 
            FileOutputStream fos = new FileOutputStream(file);
            String   string=  new String("alaaalalalalalala");
         //将文本文檔的内容由hello改變成alaaalalalalalala
            fos.write(string.getBytes());
            fos.close();
		
        }
        catch (Exception e){
            e.printStackTrace();
        }
        finally {
            fis.close();
        }
    }
}
           

使用BufferedInputStream 操作的話将 FileInputStream fis = null; 改成 BufferedInputStream fis = null;

将 fis = new FileInputStream(file);改成 fis = new BufferedInputStream(new FileInputStream(file));

java--BIO、NIO、AIOjava 的IO是什麼?JAVA IO 的三種類型
java--BIO、NIO、AIOjava 的IO是什麼?JAVA IO 的三種類型

2.NIO(同步非阻塞)

為什麼說NIO是同步非阻塞?

因為無論多少用戶端都可以接入服務端,用戶端接入并不會耗費一個線程,隻會建立一個連接配接然後注冊到selector上去,這樣你就可以去幹其他你想幹的其他事情了,一個selector線程不斷的輪詢所有的socket連接配接,發現有事件了就通知你,然後你就啟動一個線程處理一個請求即可,這個過程的話就是非阻塞的。但是這個處理的過程中,你還是要先讀取資料,處理,再傳回的,這是個同步的過程。

NIO的3個核心概念:

Buffer(緩沖區)

Channel(通道)

Selector(選擇器)

1.緩沖區(Buffer)

要通過NIO寫資料到檔案或者網絡,或者是從檔案和網絡讀取資料出來此時就需要通過Buffer緩沖區來進行。

Buffer的使用一般有如下幾個步驟:寫入資料到Buffer,調用flip()方法,從Buffer中讀取資料,調用clear()方法或者compact()方法。

Buffer包含一些要寫入或者剛讀出的資料

每一種Java基本類型(除了Boolean)都對應一種緩沖區,具體如下:

ByteBuffer

CharBuffer

ShortBuffer

IntBuffer

LongBuffer

FloatBuffer

DoubleBuffer

使用buffer時,要定義buffer的大小。

java--BIO、NIO、AIOjava 的IO是什麼?JAVA IO 的三種類型

2.讀寫通道(Channel)

Channel 是一個對象,可以通過它讀取和寫入資料。拿 NIO 與原來的 I/O 做個比較,通道就像是

流。這個通道插向緩沖區,進行資料讀寫。網絡資料通過Channel讀取和寫入。

Channel有四種實作:

FileChannel:是從檔案中讀取資料。

DatagramChannel:從UDP網絡中讀取或者寫入資料。

SocketChannel:從TCP網絡中讀取或者寫入資料。

ServerSocketChannel:允許你監聽來自TCP的連接配接,就像伺服器一樣。每一個連接配接都會有一個SocketChannel産生。

3.Selector選擇器

Selector選擇器可以監聽多個Channel通道感興趣的事情(read、write、accept(服務端接收)、connect,實作一個線程管理多個Channel,節省線程切換上下文的資源消耗。Selector隻能管理非阻塞的通道,FileChannel是阻塞的,無法管理。

java--BIO、NIO、AIOjava 的IO是什麼?JAVA IO 的三種類型

3.AIO(異步非阻塞)

AIO與NIO類似,隻是NIO需要自己去輪詢判斷作業系統完成的狀态,而AIO的話,作業系統會來回調用戶端的接口, 告訴你操作完成了。

為什麼說AIO是異步非阻塞?

通過AIO發起個檔案IO操作之後,你立馬就傳回可以幹别的事兒了,接下來你也不用管了,作業系統自己幹完了IO之後,告訴你說ok了。

當你基于AIO的api去讀寫檔案時, 當你發起一個請求之後,剩下的事情就是交給了作業系統當讀寫完成後, 作業系統會來回調你的接口, 告訴你操作完成。在這期間不需要等待, 也不需要去輪詢判斷作業系統完成的狀态,你可以去幹其他的事情。同步就是自己還得主動去輪詢作業系統,異步就是作業系統反過來通知你。是以來說, AIO就是異步非阻塞的。