1. 程式人生 > >JAVA的NIO的新特性和小Demo,進一步了解NIO

JAVA的NIO的新特性和小Demo,進一步了解NIO

讀取 sys java 傳輸 直接 通過 write != 指針

1.為什麽要用NIO

NIO 的創建目的是為了讓 Java 程序員可以實現高速 I/O 而無需編寫自定義的本機代碼。NIO 將最耗時的 I/O 操作(即填充和提取緩沖區)轉移回操作系統,因而可以極大地提高速度。 原來的 I/O 庫(在 java.io.*中) 與 NIO 最重要的區別是數據打包和傳輸的方式。正如前面提到的,原來的 I/O 以流的方式處理數據,而 NIO 以塊的方式處理數據。

技術分享圖片

2.NIO核心對象:緩沖區

什麽是緩沖區? Buffer 是一個對象, 它包含一些要寫入或者剛讀出的數據。 在 NIO 中加入 Buffer 對象,體現了新庫與原 I/O 的一個重要區別。在面向流的 I/O 中,您將數據直接寫入或者將數據直接讀到 Stream 對象中。 在 NIO 庫中,所有數據都是用緩沖區處理的。在讀取數據時,它是直接讀到緩沖區中的。在寫入數據時,它是寫入到緩沖區中的。任何時候訪問 NIO 中的數據,您都是將它放到緩沖區中。

最常用的緩沖區類型是 ByteBuffer。一個 ByteBuffer 可以在其底層字節數組上進行 get/set 操作(即字節的獲取和設置)。

3.NIO核心對象:通道

什麽是通道? Channel是一個對象,可以通過它讀取和寫入數據。拿 NIO 與原來的 I/O 做個比較,通道就像是流。 正如前面提到的,所有數據都通過 Buffer 對象來處理。您永遠不會將字節直接寫入通道中,相反,您是將數據寫入包含一個或者多個字節的緩沖區。同樣,您不會直接從通道中讀取字節,而是將數據從通道讀入緩沖區,再從緩沖區獲取這個字節。

通道類型: 通道與流的不同之處在於通道是雙向的。而流只是在一個方向上移動(一個流必須是 InputStream 或者 OutputStream 的子類), 而 通道 可以用於讀、寫或者同時用於讀寫。

實例:

NIO讀文件

@Test
    public void read() throws Exception {
        //第一步是獲取通道,我們從FileInpustream獲取通道
        FileInputStream fin = new FileInputStream("C:\\Users\\Administrator\\Desktop\\Test.txt");
        FileChannel channel = fin.getChannel();
        //下一步是創建緩沖區
        ByteBuffer buf = ByteBuffer.allocate(1024);


        StringBuilder sb 
= new StringBuilder(); //通過通道讀取文件內容到緩沖區,未讀到文件最後就一直讀取 while ((channel.read(buf)) != -1) { //調用flip之後,讀到指針到緩存頭部,並且設置最多只能讀出之前寫入的數據長度(而不是整個緩存容量的大小) buf.flip(); //循環判斷緩沖區是否還有可用數據 while (buf.hasRemaining()) { char b = (char) buf.get(); sb.append(b); //讀取緩沖區內容,轉換成CHAR型 } System.out.println(String.valueOf(sb)); //compact():只會清除已經讀過的數據 任何未讀的數據都被移到緩沖區的其實出 //新寫入的數據將放到緩沖區未讀數據的後面 buf.compact(); } }

NIO寫文件

@Test
    public void write() throws IOException {
      String  mess[] = {"09","099","665","655","355"};
        //創建文件字節輸出流
        FileOutputStream fout = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\Test2.txt");
        //從字節流中獲取通道
        FileChannel channel = fout.getChannel();
        //創建緩沖區對象 (allocate分配)
        ByteBuffer buffer = ByteBuffer.allocate(1024);

        //通過管道往緩沖區寫數據
        for (int i = 0; i <mess.length ; i++) {
            buffer.put(mess[i].getBytes());
        }

        //改變緩沖區指針
        buffer.flip();

        //把緩沖區內容寫入到通道
        channel.write(buffer);

        //緊湊
        buffer.compact();

        //關流
        fout.close();


    }

JAVA的NIO的新特性和小Demo,進一步了解NIO