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(); }

NIO读写结合

@Test
public void Nio() throws IOException {
//创建字节输入流
FileInputStream fin = new FileInputStream("C:\\Users\\Administrator\\Desktop\\Test.txt"); //创建字节输出流
FileOutputStream fout = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\Test3.txt"); //创建输入通道
FileChannel finChannel = fin.getChannel();
//创建输出通道
FileChannel foutChannel = fout.getChannel(); //创建Nio的缓冲流
ByteBuffer buffer = ByteBuffer.allocate(1024); //循环
while (true) {
//clear方法重置缓冲区,使他可以接受读入的数据()position
buffer.clear(); //从输入通道读取内容到缓冲区
int r = finChannel.read(buffer);
//如果读取到文件的结尾 返回的结果为-1
if (r == -1){
break;
}
//flip()方法可以一步步读取缓冲区的内容
buffer.flip(); foutChannel.write(buffer); }
//关流
fin.close();
fout.close();
}

JAVA的NIO的新特性和小Demo,进一步了解NIO的更多相关文章

  1. JAVA JDK1.5-1.9新特性

    1.51.自动装箱与拆箱:2.枚举(常用来设计单例模式)3.静态导入4.可变参数5.内省 1.61.Web服务元数据2.脚本语言支持3.JTable的排序和过滤4.更简单,更强大的JAX-WS5.轻量 ...

  2. Java 8 正式发布,新特性全搜罗

    经过2年半的努力.屡次的延期和9个里程碑版本,甲骨文的Java开发团队终于发布了Java 8正式版本. Java 8版本最大的改进就是Lambda表达式,其目的是使Java更易于为多核处理器编写代码: ...

  3. Java引入的一些新特性

    Java引入的一些新特性 Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本. Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程, ...

  4. 使用示例带你提前了解 Java 9 中的新特性

    使用示例带你提前了解 Java 9 中的新特性 转载来源:https://juejin.im/post/58c5e402128fe100603cc194 英文出处:https://www.journa ...

  5. Java学习之==>Java8 新特性详解

    一.简介 Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级.Java 8是 Java 自 Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库. ...

  6. 【Java基础】Java8 新特性

    Java8 新特性 Lambda 表达式 Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递).使用它可以写出更简洁.更灵活的代码. L ...

  7. 【Java基础】Java11 新特性

    Java11 新特性 新增字符串处理方法 新增方法: 判断字符串是否为空白 " ".isBlank(); // true 去除首尾空白 " Javastack " ...

  8. JAVA笔记 之 JDK新特性

    JDK1.5新特性1.泛型(Generics) 为集合(collections)提供编译时类型安全,无需每刻从Collections取得一个对象就进行强制转换(cast) 2.增强的for循环(for ...

  9. Java系列 - 用Java8新特性进行Java开发太爽了

    本人博客文章网址:https://www.peretang.com/using-java8s-new-features-to-coding-is-awesome/ 前言 从开始写博客到现在已经过去3个 ...

随机推荐

  1. C++中的关键知识点(汇总)

    1. class的virtual 与non-virtual的区别 (1)virtual 函数时动态绑定,而non-virtual是静态绑定,前者是多态效果. (2)多态类的析构函数应该为virtual ...

  2. Delphi 文件拷贝

    function DoCopyDir(sDirName:String;sToDirName:String):Boolean;var hFindFile:Cardinal; t,tfile:String ...

  3. 9.使用GetData,Children实现对ZNode的监控

    一. zookeeper中的watcher 1. exists :监控的是[znode]的CUD 的操作   2. getdata 的时候注册的watcher[U,D 监控]update delete ...

  4. Replication--如何使用快照来初始化化请求订阅

    这是一篇针对新人的知识普及文章,老人慎入! 在快照发布和事务发布中,SQL Server需要使用快照来将数据库某一时间点的数据传递给订阅,快照使用BCP的机制. 首先我们需要查看和设置快照的生成目录, ...

  5. Js 事件详解

    1.事件流 1.1 事件流 描述的是在页面中接受事件的顺序 1.2 事件冒泡 由最具体的元素接收,然后逐级向上传播最不具体的元素的节点(文档) 1.3 事件捕获 最不具体的节点先接收事件,而最具体的节 ...

  6. C# 收银机顾显(客显)及打印小票(58热敏打印机)

    最近做winform收银机,设计顾显及打印小票总结. 1.顾显(串口COM1) 只涉及到总计,所以只是简单的功能. public static ClientDisplayResult Display( ...

  7. Gogland使用 - 非常简单查看Go语言源代码全貌!

    Go语言也支持面向对象开发,不过和以往我们所使用的面向对象开发还是有不同,Go语言主张组合方式形成类的概念,在Go语言中,结构起到很大作用,如果用结构组合字段和方法,那么单纯在源代码中看,真的是费时费 ...

  8. 【OCP-12c】CUUG 071题库考试原题及答案解析(20)

    20.choose two Examine the description of the EMP_DETAILS table given below: Which two statements are ...

  9. “全栈2019”Java异常第十八章:Exception详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  10. Bootstrap框架常用总结

    Bootstrap框架常用标签:    标题标签:<h1>-<h6>        bootstrap中也设置的相同的样式  - 若要使用 必须使用空标签来定义 比如<s ...