给出一个学习的链接讲的很全。。

http://ifeve.com/java-nio-all/

上边的是中文翻译的这里是原地址:
http://tutorials.jenkov.com/java-nio/overview.html

Channel:

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel

Buffer:

  • ByteBuffer
  • CharBuffer
  • DoubleBuffer
  • FloatBuffer
  • IntBuffer
  • LongBuffer
  • ShortBuffer
  • Mappedyteuffer

Selector:

利用Channel与Buffer对文件的读写

  1. import java.io.BufferedInputStream;
  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileNotFoundException;
  6. import java.io.FileReader;
  7. import java.io.FileWriter;
  8. import java.io.FilenameFilter;
  9. import java.io.IOException;
  10. import java.io.InputStream;
  11. import java.io.InputStreamReader;
  12. import java.io.OutputStream;
  13. import java.io.PrintStream;
  14. import java.io.PrintWriter;
  15. import java.io.ObjectInputStream.GetField;
  16. import java.io.RandomAccessFile;
  17. import java.lang.ref.PhantomReference;
  18. import java.lang.ref.Reference;
  19. import java.lang.ref.ReferenceQueue;
  20. import java.lang.ref.SoftReference;
  21. import java.lang.ref.WeakReference;
  22. import java.nio.ByteBuffer;
  23. import java.nio.CharBuffer;
  24. import java.nio.channels.FileChannel;
  25. import java.util.ArrayList;
  26. import java.util.Arrays;
  27. import java.util.Collection;
  28. import java.util.Collections;
  29. import java.util.HashSet;
  30. import java.util.Iterator;
  31. import java.util.LinkedList;
  32. import java.util.List;
  33. import java.util.Set;
  34. import java.util.regex.Pattern;
  35.  
  36. public class Test{
  37.  
  38. public static void main(String[] args) throws IOException {
  39.  
  40. RandomAccessFile accessFile = new RandomAccessFile(new File("/home/estar/Test/a.java"), "rw");
  41. //获得文件通道
  42. FileChannel fileChannel = accessFile.getChannel();
  43. //分配缓冲区
  44. ByteBuffer bf = ByteBuffer.allocate(1024);
  45. //首先判断一下是否有数据可读
  46. int byteReads = fileChannel.read(bf);
  47. //如果缓冲区里有数据
  48. while (byteReads != -1){
  49. System.out.println("byteReads : " + byteReads);
  50. //切换到读模式
  51. bf.flip();
  52. //读position 到 limit之间的数据
  53. while (bf.hasRemaining()) {
  54. System.out.println((char)bf.get());
  55. }
  56. //清空读出来的数据
  57. bf.clear();
  58. //重新读取
  59. byteReads = fileChannel.read(bf);
  60. }
  61. //写入数据之前首先清空一下缓冲区
  62. bf.clear();
  63. //放入数据
  64. bf.put("AAHJKHJK".getBytes());
  65. //将position置0
  66. bf.flip();
  67. fileChannel.write(bf);
  68. fileChannel.write(ByteBuffer.wrap("nixing".getBytes()));
  69.  
  70. }
  71. }

  

实现两个文件内容的复制:

  1. FileChannel
  2. in = new FileInputStream("/home/estar/Test/a.java").getChannel(),
  3. out = new FileOutputStream("/home/estar/Test/b.java").getChannel();
  4.  
  5. ByteBuffer buf = ByteBuffer.allocate(1024);
  6.  
  7. while ((in.read(buf)) != -1){
  8. buf.flip();
  9. out.write(buf);
  10. buf.clear();
  11. }

  

内存映射文件:

MapByteBuffer的与普通I/O的比较

  1. import java.io.BufferedInputStream;
  2. import java.io.BufferedOutputStream;
  3. import java.io.BufferedReader;
  4. import java.io.DataInputStream;
  5. import java.io.DataOutputStream;
  6. import java.io.File;
  7. import java.io.FileInputStream;
  8. import java.io.FileNotFoundException;
  9. import java.io.FileOutputStream;
  10. import java.io.FileReader;
  11. import java.io.FileWriter;
  12. import java.io.FilenameFilter;
  13. import java.io.IOException;
  14. import java.io.InputStream;
  15. import java.io.InputStreamReader;
  16. import java.io.OutputStream;
  17. import java.io.PrintStream;
  18. import java.io.PrintWriter;
  19. import java.io.ObjectInputStream.GetField;
  20. import java.io.RandomAccessFile;
  21. import java.lang.ref.PhantomReference;
  22. import java.lang.ref.Reference;
  23. import java.lang.ref.ReferenceQueue;
  24. import java.lang.ref.SoftReference;
  25. import java.lang.ref.WeakReference;
  26. import java.nio.ByteBuffer;
  27. import java.nio.CharBuffer;
  28. import java.nio.IntBuffer;
  29. import java.nio.channels.FileChannel;
  30. import java.util.ArrayList;
  31. import java.util.Arrays;
  32. import java.util.Collection;
  33. import java.util.Collections;
  34. import java.util.HashSet;
  35. import java.util.Iterator;
  36. import java.util.LinkedList;
  37. import java.util.List;
  38. import java.util.Set;
  39. import java.util.regex.Pattern;
  40.  
  41. import javax.xml.datatype.Duration;
  42.  
  43. /*
  44. * 尽管旧的I/O在用nio实现后性能有所提高, 但是“映射文件访问”往往可以更加显著地加快速度
  45. */
  46. public class Test {
  47.  
  48. public static int numOfInts = 400000;
  49.  
  50. //抽象类提供模板方法
  51. public abstract static class Tester {
  52. String name;
  53. public Tester(String name) {
  54. this.name = name;
  55. }
  56. //模板方法
  57. public void runTest() {
  58. System.out.print("test : " + name + " : ");
  59. long start = System.nanoTime();
  60. test();
  61. long end = System.nanoTime();
  62. double duration = (end - start) / 1.0e9;
  63. System.out.format("%.2f\n", duration);
  64. }
  65.  
  66. public abstract void test();
  67. }
  68.  
  69. public static Tester[] tests = {
  70.  
  71. /*
  72. * 匿名内部类提供模板的具体实现
  73. */
  74. new Tester("Stream Write:") {
  75. @Override
  76. public void test() {
  77. try {
  78. DataOutputStream dos = new DataOutputStream(
  79. new BufferedOutputStream(new FileOutputStream(new File(
  80. "tmp.tmp"))));
  81. for (int i = 0; i < numOfInts; ++i) {
  82. dos.writeInt(i);
  83. }
  84. dos.close();
  85. } catch (IOException e) {
  86. // TODO Auto-generated catch block
  87. e.printStackTrace();
  88. }
  89. }
  90. }, new Tester("Mapped Write:") {
  91. @Override
  92. public void test() {
  93. try {
  94. FileChannel fchinal = new RandomAccessFile("tmp.tmp", "rw")
  95. .getChannel();
  96. try {
  97. IntBuffer intBuffer = fchinal.map(
  98. FileChannel.MapMode.READ_WRITE, 0, fchinal.size())
  99. .asIntBuffer();
  100. for (int i = 0; i < numOfInts; ++i) {
  101. intBuffer.put(i);
  102. }
  103. fchinal.close();
  104.  
  105. } catch (IOException e) {
  106. // TODO Auto-generated catch block
  107. e.printStackTrace();
  108. }
  109.  
  110. } catch (FileNotFoundException e) {
  111. // TODO Auto-generated catch block
  112. e.printStackTrace();
  113. }
  114. }
  115. }, new Tester("Stream Read") {
  116.  
  117. @Override
  118. public void test() {
  119. try {
  120. DataInputStream dis = new DataInputStream(new BufferedInputStream(
  121. new FileInputStream(new File("tmp.tmp"))));
  122. for (int i = 0; i < numOfInts; ++i) {
  123. dis.readInt();
  124. }
  125. dis.close();
  126. } catch (Exception e) {
  127. // TODO Auto-generated catch block
  128. e.printStackTrace();
  129. }
  130.  
  131. }
  132. },new Tester("Map Read") {
  133.  
  134. @Override
  135. public void test() {
  136. FileChannel fChannel;
  137. try {
  138. fChannel = new RandomAccessFile("tmp.tmp", "rw").getChannel();
  139. IntBuffer intBuffer = fChannel.map(FileChannel.MapMode.READ_WRITE, 0, fChannel.size()).asIntBuffer();
  140. for (int i = 0; i < numOfInts; ++i) {
  141. intBuffer.get();
  142. }
  143. fChannel.close();
  144. } catch (Exception e) {
  145. // TODO Auto-generated catch block
  146. e.printStackTrace();
  147. }
  148. }
  149. },
  150. new Tester("Stream Read/Write") {
  151.  
  152. @Override
  153. public void test() {
  154. RandomAccessFile raf;
  155. try {
  156. raf = new RandomAccessFile("tmp.tmp", "rw");
  157. raf.writeInt(1);
  158. for(int i = 0; i < numOfInts; ++i){
  159. raf.seek(raf.length() - 4);
  160. raf.writeInt(raf.readInt());
  161. }
  162. raf.close();
  163. } catch (Exception e) {
  164. // TODO Auto-generated catch block
  165. e.printStackTrace();
  166. }
  167. }
  168. },
  169. new Tester("Map Read/Write") {
  170.  
  171. @Override
  172. public void test() {
  173. FileChannel fChannel;
  174. try {
  175. fChannel = new RandomAccessFile("tmp.tmp", "rw").getChannel();
  176. IntBuffer intBuffer = fChannel.map(FileChannel.MapMode.READ_WRITE, 0, fChannel.size()).asIntBuffer();
  177. intBuffer.put(1);
  178. for (int i = 1; i <= numOfInts; ++i) {
  179. intBuffer.put(intBuffer.get(i - 1));
  180. }
  181. } catch (Exception e) {
  182. // TODO Auto-generated catch block
  183. e.printStackTrace();
  184. }
  185.  
  186. }
  187. }
  188.  
  189. };
  190.  
  191. public static void main(String[] args) throws IOException {
  192. for (Tester tester : tests) {
  193. tester.runTest();
  194. }
  195.  
  196. }
  197. }
  198.  
  199. 输出:
  200. test : Stream Write: : 0.06
  201. test : Mapped Write: : 0.01
  202. test : Stream Read : 0.06
  203. test : Map Read : 0.01
  204. test : Stream Read/Write : 3.43
  205. test : Map Read/Write : 0.01

  

Java I/O NIO学习的更多相关文章

  1. JAVA NIO学习一:NIO简介、NIO&IO的主要区别

    在前面学习了IO之后,今天我们开始进入NIO学习环节,首先我们会NIO做一个简单的介绍,让大家认识NIO,然后会和IO进行一个对比认识进行区分.好了,下面我们就开始学习: 一.NIO简介 1.概述 从 ...

  2. Java NIO学习与记录(八): Reactor两种多线程模型的实现

    Reactor两种多线程模型的实现 注:本篇文章例子基于上一篇进行:Java NIO学习与记录(七): Reactor单线程模型的实现 紧接着上篇Reactor单线程模型的例子来,假设Handler的 ...

  3. Java NIO学习笔记

    Java NIO学习笔记 一 基本概念 IO 是主存和外部设备 ( 硬盘.终端和网络等 ) 拷贝数据的过程. IO 是操作系统的底层功能实现,底层通过 I/O 指令进行完成. 所有语言运行时系统提供执 ...

  4. 零拷贝详解 Java NIO学习笔记四(零拷贝详解)

    转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ...

  5. Java NIO 学习笔记(七)----NIO/IO 的对比和总结

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  6. Java NIO 学习笔记(六)----异步文件通道 AsynchronousFileChannel

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  7. Java NIO 学习笔记(五)----路径、文件和管道 Path/Files/Pipe

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  8. Java NIO 学习笔记(四)----文件通道和网络通道

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  9. Java NIO 学习笔记(三)----Selector

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

随机推荐

  1. Mysql服务器相互作用的通讯协议包括TCP/IP,Socket,共享内存,命名管道

    MySQL实现了四种通信协议 TCP/IP协议,通常我们通过来连接MySQL,各种主要编程语言都是根据这个协议实现了连接模块 Unix Socket协议,这个通常我们登入MySQL服务器中使用这个协议 ...

  2. Content Delivery Network

    Coding Standards & Best Practices 7 Reasons to use a Content Delivery Network CDN公共库汇总

  3. WinCE Show App Icon

    找个图片,例如背景透明的jpg或png,上http://www.pic2icon.com/smartphone_wince_icon_generator.php这个网站转换下. 在项目属性中,设为图标 ...

  4. Docker第三方项目小结

    软件项目的成功常常根据其催生的生态系统来衡量.围绕或基于核心技术构建的项目增添了功能和易用性,它们常常日臻完善.Docker就是一个典例,有众多第三方项目扩展.补充或改进Docker. •Docker ...

  5. 给windows服务打包,并生成安装程序

    一. 添加新建项目-->安装部署-->安装项目 二.安装程序上-->右键视图-->文件系统-->应用程序文件夹-->右键-->添加项目输出 选择做好的wind ...

  6. PHP过滤评论关键词

    <?php /** * PHP中屏蔽过滤指定关键字实现方法总结 * http://www.111cn.net/phper/phpanqn/46225.htm * * 思路: * 一.把关键字专门 ...

  7. C#:控制台程序调用中间库创建窗体

    1.类库项目引用System.Windows.Forms并添加引用后,才可创建窗体. 2.控制台应用程序调用中间库(DLL)中的方法创建窗体:中间类库使用反射下的Assembly加载包含窗体的类库及创 ...

  8. HDU 4706:Children's Day

    Children's Day Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  9. Boring count(字符串处理)

    Boring count Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...

  10. Apache common pool2 对象池

    对象池的容器:包含一个指定数量的对象.从池中取出一个对象时,它就不存在池中,直到它被放回.在池中的对象有生命周期:创建,验证,销毁,对象池有助于更好地管理可用资源,防止JVM内部大量临时小对象,频繁触 ...