使用传统的输入输出流,当读取输入流中的数据如果没有没有读到有效的数据时,程序将在此处阻塞该线程的执行(使用InputStream的read方法从流中读取数据时,如果数据源中没有数据,它也会阻塞该线程),传统的输入、输出流都是阻塞式的输入输出。不仅如此,传统的输入、输出流都是通过字节的移动来处理的(即使我们可以不直接去处理字节流,但底层的实现还是依赖于字节处理流),也就是说面向流的输入、输出系统一次只能处理一个字节,因此面向流的输入、输出系统通常效率不高。

从jdk1.4开始,java提供了一系列改进的输入、输出处理的新特性。新IO和传统的IO有相同目的,都是用于进行输入、输出的功能。

新IO使用了不同的方式来处理输入、输出,新IO采用内存映射文件的方式来处理输入输出,新IO将文件或文件的一段区域映射到内存中,这样就可以像访问内存一样来访问文件了,通过这种方式来进行输入、输出比传统的输入输出要快的多。

新IO中的两个核心的对象是:Buffer(缓冲)和Channel(通道)。Channel与传统的InputStream、OutputStream最大的区别在于它提供了一个map方法,通过该map方法可以直接将“一块数据”映射到内存中去。如果说传统的流处理方式是面向流的,那么新IO则是面向块的处理。Buffer可以被理解成一个容器,它的本质是一个数组,发送到Channel中的所有对象都必须放到Buffer中,而从Channel中读取的数据也必须先读到Buffer中。

一、Buffer

Buffer是一个抽象类,从内部结构来看,Buffer就像一个数组,它可以在底层字节数组上进行set/get操作。对应其他基本数据类型(boolean除外)都有相应的Buffer类:ByteBuffer、CharBuffer、ShortBuffer、等。

创建Buffer对象:static   XXXBuffer allocate(int capacity)

在Buffer中有三个重要的概念:容量(capacity)、界限(limit)、和位置(position)(位置是从0开始的)。

当Buffer装入数据结束后,调用Buffer的flip方法,该方法将limit设置为position所在位置,将position设置为0,这样使得从Buffer中读取数据时总是从0开始。

当Buffer输出数据结束后,Buffer调用clear方法,clear方法是将position设置为0,limit设置为capacity,这样为再次向Buffer中写入数据做好准备。

二、Channel

Channel类似于传统的流对象,但与传统的流不同的是,Channel有两个主要的区别:

①、Channel可以直接将指定文件的部分或全部直接映射成Buffer。

②、程序不能直接访问Channel中的数据,包括读取、写入都不行,Channel只能与Buffer进行交互。

Channel也是一个接口,系统为该接口提供了DatagramChannel、FileChannel等实现类。

所有的Channel都不应该通过构造器来创建,而是通过传统的节点InputStream、OutputStream的getChannel方法来创建。在RandomAccessFile中也包含一个getChannel方法。

Channel中最常用的三个方法:map、read、write,其中map方法用于将Channel对应的部分或全部数据映射的ByteBuffer。

最新文章

  1. 04-c#入门(类型转换)
  2. 【帖子】怎么彻底删除kafka的topic,然后重建?
  3. 超链接弹出QQ对话框
  4. linux 安装程序
  5. 【锋利的JQuery-学习笔记】遮罩层
  6. ACdream训练赛系列のJava专场
  7. 初次使用Oracle
  8. Intellij 快捷键
  9. WebSocket In ASP.NET Core(二)
  10. c=$[$c%5]到let c=$c%5的转换
  11. 开源纯C#工控网关+组态软件(八)表达式编译器
  12. 【java线程池】
  13. Redhat中关于httpd仓库安装的简要步骤
  14. 【HDU5187】contest
  15. models.DateTimeField(auto_now_add=True) 与 models.DateTimeField(auto_now=True)
  16. Ubuntu下搭建高匿HTTP代理(亲测可用)
  17. 利用session防止表单重复提交
  18. Python+Selenium学习--定位iframe中的对象
  19. tableview中头部信息
  20. Jmeter高阶学习,运用NotePad++编写工程,随意复制多个工程到同一个工程

热门文章

  1. Hadoop MapReduce编程 API入门系列之网页流量版本1(二十一)
  2. guice基本使用,三种注入方式(二)
  3. C#中大批量导入数据SqlBulkCopy
  4. Memcached 与 Redis 的关键性能指标比较
  5. nodejs -- crypto MD5签名
  6. 11.javaweb国际化标签库
  7. SqlServer与MySql 系统表查询自建表数据
  8. Linux vi命令快操作汇总
  9. 「图解HTTP 笔记」Web 基础
  10. 关于XML学习