首頁  >  文章  >  Java  >  NIO的概述及NIO與IO的對比

NIO的概述及NIO與IO的對比

零下一度
零下一度原創
2017-06-27 09:47:491649瀏覽

 一概述

 1.NIO

   New IO,從java1.4版本引入的新IO,可取代標準的IO。

       2.Channel

   代表一個與資料來源的開放連接,可以讀取和寫入數據,而這種讀取和寫入操作都是基於數據塊。

  3.Buffer

#    channel讀寫資料的緩衝區,channel將讀取的資料存放到Buffer中,將Buffer中的資料寫入文件中。

  4.Selector

#    允許一個執行緒監控多個channel。

  5.RandomAccessFile

   一個同時支援讀寫、隨機存取的檔案操作對象,相當於一個包含檔案全部位元組的陣列。

二NIO與IO比較

 1.基本資料單位

   IO以位元組或字元為基本單位,NIO以資料塊為基本單位。

  2.阻塞

   IO操作阻塞線程,NIO不會阻塞執行緒。

  3.索引

   IO操作的流不存在索引,無法指定操作位置。 NIO的資料中存在索引,可以指定操作位置。

  4.鎖定

   IO不支援鎖定,NIO支援鎖定,鎖定的功能是控制檔案的存取。

   三Channel

#  1.物件建立:

基於輸入與輸出流建立對象:

InputStream is=new FileInputStream(String name);
FileChannel channel=is.getChannel();

基於RandomAccessFile物件建立物件

RandonAccessFile file=new RandomAccessFile(String name ,"rw");
FileChannel channel=file.getChannel();

2.基於輸入流創建的物件只能輸入,基於輸出流所建立的物件只能輸出,而基於RandomAccessFile所建立的物件既可以輸入也可以輸出。

3.Channel中的資料存在索引,可以指定讀寫位置。

4.常用方法

  • #truncate(long size):從開頭截取指定位元組長度的內容,其餘部分刪除。如果長度大於檔案目前大小,則該操作失效。

四Buffer

# NIO為每個基本資料型別提供了一個緩衝區,操縱方法相同,以下以ByteBuffer為例進行梳理。

1.三個重要屬性

  • #position:目前遊標位置,用來決定讀寫的起點。

  • limit:上限,用來決定讀寫的範圍,不包含所在索引。

  • capacity:容量,用來決定所能存放的最大資料量。

2.物件建立

ByteBuffer byteBuffer=ByteBuffer.allocate();//通过分配指定长度的存储单位来创建缓冲区ByteBuffer byteBuffer=ByteBuffer.wrap(byte[] array);//基于数组创建缓冲区

3.常用方法:

  • put(Object data):将数据写入当前位置,同时将光标向前移动一个数据单位。

  • get():获取当前位置的数据,同时将光标向前移动一个数据单位。

  • flip():通过调整position与limit的值切换读写模式。

  • clear():并非清空缓冲区,而是调整position=0,limit=capacity,mark=-1。

  • array():将ByteBuffer中的数据复制的数组中。

五 MappedByteBuffer

在系统当中建立文件的映射,如果采用读写模式,那么对该映射的操作会反映到文件中。

由于将文件映射到内存中,资源消耗较大,只有在文件较大的情况下才将文件映射到内存中。

获取对象

MappedByteBuffer mbb=channel.map(MapMode mode,long offset,long size);

有3中映射方式:

  • READ_ONLY:映射内容只允许读,不允许修改。

  • READ_WRITE:映射内容既允许读,也允许改,修改内容会反映到文件中。

  • PRIVATE:在本地创建一个副本,读写操作都是针对副本,写不会反映到原始文件中。

以上是NIO的概述及NIO與IO的對比的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn