一概述
New IO,從java1.4版本引入的新IO,可取代標準的IO。
代表一個與資料來源的開放連接,可以讀取和寫入數據,而這種讀取和寫入操作都是基於數據塊。
# channel讀寫資料的緩衝區,channel將讀取的資料存放到Buffer中,將Buffer中的資料寫入文件中。
# 允許一個執行緒監控多個channel。
一個同時支援讀寫、隨機存取的檔案操作對象,相當於一個包含檔案全部位元組的陣列。
IO以位元組或字元為基本單位,NIO以資料塊為基本單位。
IO操作阻塞線程,NIO不會阻塞執行緒。
IO操作的流不存在索引,無法指定操作位置。 NIO的資料中存在索引,可以指定操作位置。
IO不支援鎖定,NIO支援鎖定,鎖定的功能是控制檔案的存取。
基於輸入與輸出流建立對象:
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中的資料存在索引,可以指定讀寫位置。
#truncate(long size):從開頭截取指定位元組長度的內容,其餘部分刪除。如果長度大於檔案目前大小,則該操作失效。
# NIO為每個基本資料型別提供了一個緩衝區,操縱方法相同,以下以ByteBuffer為例進行梳理。
#position:目前遊標位置,用來決定讀寫的起點。
limit:上限,用來決定讀寫的範圍,不包含所在索引。
capacity:容量,用來決定所能存放的最大資料量。
ByteBuffer byteBuffer=ByteBuffer.allocate();//通过分配指定长度的存储单位来创建缓冲区ByteBuffer byteBuffer=ByteBuffer.wrap(byte[] array);//基于数组创建缓冲区
put(Object data):将数据写入当前位置,同时将光标向前移动一个数据单位。
get():获取当前位置的数据,同时将光标向前移动一个数据单位。
flip():通过调整position与limit的值切换读写模式。
clear():并非清空缓冲区,而是调整position=0,limit=capacity,mark=-1。
array():将ByteBuffer中的数据复制的数组中。
在系统当中建立文件的映射,如果采用读写模式,那么对该映射的操作会反映到文件中。
由于将文件映射到内存中,资源消耗较大,只有在文件较大的情况下才将文件映射到内存中。
MappedByteBuffer mbb=channel.map(MapMode mode,long offset,long size);
有3中映射方式:
READ_ONLY:映射内容只允许读,不允许修改。
READ_WRITE:映射内容既允许读,也允许改,修改内容会反映到文件中。
PRIVATE:在本地创建一个副本,读写操作都是针对副本,写不会反映到原始文件中。
以上是NIO的概述及NIO與IO的對比的詳細內容。更多資訊請關注PHP中文網其他相關文章!