Rumah > Java > javaTutorial > NIO的概述及NIO与IO的对比

NIO的概述及NIO与IO的对比

零下一度
Lepaskan: 2017-06-27 09:47:49
asal
1732 orang telah melayarinya

 一 概述

 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();
Salin selepas log masuk

基于RandomAccessFile对象创建对象

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

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);//基于数组创建缓冲区
Salin selepas log masuk

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);
Salin selepas log masuk

有3中映射方式:

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

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

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

Atas ialah kandungan terperinci NIO的概述及NIO与IO的对比. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan