`
Mojarra
  • 浏览: 128872 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Java NIO小结 (一)

    博客分类:
  • JDK
阅读更多

    自JDK1.4后,Java推出了New/IO(java.nio.*)。在JDK1.4之前,原IO(java.io.*)处理只能是stream的方式 逐个字节逐个字节读取或者写入。流处理方式性能低。而New/IO处理数据时以块为单位,系统的IO开销小,但IO性能高。



New/IO的4个核心概念

Buffer 处理IO时,数据的载体

Charset 把unicode字符进行编码成字节码或者把字节码反编成unicode字符

Channel 连接着能进行IO操作的实体,比如一个Channel可以连接一个输入流,也可以连接一个输出流,还可以连接一个输入流和一个输入流,根据channel上连接的具体的流,可以进行输入或输出操作。

SelectorSelectionKey 与Selectable Channel一起,定义了多路复用和Non-Blocking IO操作能力。


Blocking IO和Non-Blocking IO

阻塞IO模式下,任何IO操作会阻塞Channel直到这个IO操作完成后,方可在这个通道上进行其它IO操作。非阻塞模式下,一个IO操作调用时,通道不会被阻塞,即使这个IO操作只传输了少量数据甚至完全没有传输数据。非阻塞模式最适用于多路复用IO编程,比如服务器端socket编程。

 

在JDK1.4中,传统的IO与New/IO已经有很好的集成,在传统的io包中,可以使用Channel,但是要根据具体的输入和输出流来决定。比如下 面的代码先定义一个文件输入流,通过文件输入流的FileChannel读取文件的头512个字节到缓存中,然后使用utf-8编码器把缓存中的内容反编 码成一个utf-8字符串。

 

Charset utf8 = Charset.forName("utf-8");
ByteBuffer buffer = ByteBuffer.allocate(512);
FileInputStream fis = new FileInputStream("a.txt");
FileChannel fileChannel = fis.getChannel();
fileChannel.read(buffer);
buffer.flip();
String content = utf8.decode(buffer);

 

反之,用FileChannel写入文件也是相当的方便,和读取类似。FileChannel写入的方式依赖于输入流的打开方式。下面的代码以 Append方式打开一个文件输出流,用这个流的FileChannel写入编码后的“hello java new IO"字符串。

 

FileOutputStream fos = new FileOutputStream("a.txt", true);
FileChannel fileChannel = fos.getChannel();		 
fileChannel.write(utf8.encode("hello java new IO"));

 

使用Channel的优点在于channel是可以同时输入输出的,而不要像传统的io那样打开一个输入流,打开一个输出流,在读/写时,这两个流总是要配对使用,下面的代码展示如何用一个FileChannel做输入和输出两种IO操作。

Charset utf8 = Charset.forName("utf-8");
//以读写方式随机存储文件
RandomAccessFile raf = new RandomAccessFile("1.txt", "rws");
FileChannel fc = raf.getChannel();

//写入hello file channel到文件中
fc.write(utf8.encode("hello file channel"));

//分配10个字节缓存
ByteBuffer buff = ByteBuffer.allocate(10);

//从文件起始位置开始读取10个字节,并输出
fc.read(buff, 0);
buff.flip();
System.out.println(utf8.decode(buff)); // 输出hello file
fc.close();
raf.close();

 

 

 

[原创内容,版权所有,如有转载,请注明出处,如有错误之处,请指出,不胜感激]

分享到:
评论

相关推荐

    Java基础知识点总结.docx

    Java数组与集合小结 305 递归 309 对象的序列化 310 Java两种线程类:Thread和Runnable 315 Java锁小结 321 java.util.concurrent.locks包下常用的类 326 NIO(New IO) 327 volatile详解 337 Java 8新特性 347 Java...

    Java SE实践教程 pdf格式电子书 下载(四) 更新

    感谢大家的支持,我终于升级了,上传限制得到提升,所以把资源整合下!希望大家一如既往 Java SE实践教程 pdf格式电子书 下载(一) 更新 ...Java SE实践教程 pdf格式电子书 下载(二) 更新 ...13.4 小结 387

    Java SE实践教程 pdf格式电子书 下载(一) 更新

    感谢大家的支持,我终于升级了,上传限制得到提升,所以把资源整合下!希望大家一如既往 Java SE实践教程 pdf格式电子书 下载(一) 更新 ...Java SE实践教程 pdf格式电子书 下载(二) 更新 ...13.4 小结 387

    疯狂JAVA讲义

    1.9 本章小结 22 本章练习 22 第2章 理解面向对象 23 2.1 面向对象 24 2.1.1 结构化程序设计简介 24 2.1.2 程序的三种基本结构 25 2.1.3 面向对象程序设计简介 27 2.1.4 面向对象的基本特征 28 2.2 UML...

    Java SE实践教程 源代码 下载

    1.3 小结 35 第2章 对象无处不在——面向对象的基本概念 37 2.1 讲解 38 2.1.1 什么是面向对象 38 2.1.2 面向对象的基本概念 38 2.1.3 Java对面向对象的支持 41 2.2 练习 42 2.2.1 JavaBeans技术开发可重用...

    JavaNetIO

    Java NetIO 一步步从BIO - > BIO+多线程- >单线程+NIO(非阻塞IO) - > NIO(IO多路复用+单线程) - > NIO(IO多路复用+多线程) Java中的NIO其实是NewIO(另一种解释是NO-blocking IO,确实,在Java...小结:ServerSocketCh

    看透springMvc源代码分析与实践

    前言 第一篇 网站基础知识 第1章 网站架构及其演变过程2 1.1 软件的三大类型2 1.2 基础的结构并不简单3 1.3 架构演变的起点5 1.4 海量数据的解决方案5 1.4.1 缓存和页面静态化5 ...22.3 小结309

    Java CP/IP Socket编程

    5.6.4 Selector小结..........144 5.7 数据报(UDP)信道..........144 5.8 练习..........149 1. 使用定长的写缓冲区改写TCPEchoClientNonblocking.java。..........149 2.使用Buffer和DatagramChannel编写一个...

    Android C++高级编程:使用NDK_Onur Cinar, 于红PDF电子书下载 带书签目录 完整版

    Android C++高级编程:使用NDK_Onur Cinar, 于红PDF电子书下载 带书签目录 完整版 原书名:Pro Android C++ with the NDK 原出版社: Apress 作者: (美)Onur Cinar 译者: 于红 佘建伟 冯艳红 ...14.4 小结 344

    pro_android_cpp_with_the_ndk.pdf

    1.5 小结 第2章 深入了解AndroidNDK 2.1 AndroidNDK提供的组件 2.2 AndroidNDK的结构 2.3 以一个示例开始 2.3.1 指定AndroidNDK的位置 2.3.2 导入示例项目 2.3.3 向项目中添加原生支持 2.3.4 运行项目 2.3.5 用...

    Android 大文件上传时处理上传进度问题小结

    进行大文件上传时,显示上传进度是很好的用户体验,可以有效的缓解用户急躁的情绪。今天Android IT 分享一个好的显示上传进度的解决方案。 我们用到以下两个类就可实现带进度条的文件上传:...import java.nio.charset

Global site tag (gtag.js) - Google Analytics