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

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对文件的读写

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.ObjectInputStream.GetField;
import java.io.RandomAccessFile;
import java.lang.ref.PhantomReference;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.regex.Pattern;public class Test{public static void main(String[] args) throws IOException {RandomAccessFile accessFile = new RandomAccessFile(new File("/home/estar/Test/a.java"), "rw"); //获得文件通道FileChannel fileChannel = accessFile.getChannel();//分配缓冲区ByteBuffer bf = ByteBuffer.allocate(1024);//首先判断一下是否有数据可读int byteReads = fileChannel.read(bf);//如果缓冲区里有数据while (byteReads != -1){System.out.println("byteReads : " +  byteReads);//切换到读模式bf.flip();//读position 到 limit之间的数据while (bf.hasRemaining()) {System.out.println((char)bf.get());}//清空读出来的数据bf.clear();//重新读取byteReads = fileChannel.read(bf);}//写入数据之前首先清空一下缓冲区bf.clear();//放入数据bf.put("AAHJKHJK".getBytes());//将position置0bf.flip();fileChannel.write(bf);fileChannel.write(ByteBuffer.wrap("nixing".getBytes()));}
}

  

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

 FileChannel in = new FileInputStream("/home/estar/Test/a.java").getChannel(),out = new FileOutputStream("/home/estar/Test/b.java").getChannel();ByteBuffer buf = ByteBuffer.allocate(1024);while ((in.read(buf)) != -1){buf.flip();out.write(buf);buf.clear();}

  

内存映射文件:

MapByteBuffer的与普通I/O的比较

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.ObjectInputStream.GetField;
import java.io.RandomAccessFile;
import java.lang.ref.PhantomReference;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.IntBuffer;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.regex.Pattern;import javax.xml.datatype.Duration;/** 尽管旧的I/O在用nio实现后性能有所提高, 但是“映射文件访问”往往可以更加显著地加快速度*/
public class Test {public static int numOfInts = 400000;//抽象类提供模板方法public abstract static class Tester {String name;public Tester(String name) {this.name = name;}//模板方法public void runTest() {System.out.print("test  : " + name + " : ");long start = System.nanoTime();test();long end = System.nanoTime();double duration = (end - start) / 1.0e9;System.out.format("%.2f\n", duration);}public abstract void test();}public static Tester[] tests = { /** 匿名内部类提供模板的具体实现*/new Tester("Stream Write:") {@Overridepublic void test() {try {DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(new File("tmp.tmp"))));for (int i = 0; i < numOfInts; ++i) {dos.writeInt(i);}dos.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}, new Tester("Mapped Write:") {@Overridepublic void test() {try {FileChannel fchinal = new RandomAccessFile("tmp.tmp", "rw").getChannel();try {IntBuffer intBuffer = fchinal.map(FileChannel.MapMode.READ_WRITE, 0, fchinal.size()).asIntBuffer();for (int i = 0; i < numOfInts; ++i) {intBuffer.put(i);}fchinal.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}, new Tester("Stream Read") {@Overridepublic void test() {try {DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream(new File("tmp.tmp"))));for (int i = 0; i < numOfInts; ++i) {dis.readInt();}dis.close();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}},new Tester("Map Read") {@Overridepublic void test() {FileChannel fChannel;try {fChannel = new RandomAccessFile("tmp.tmp", "rw").getChannel();IntBuffer intBuffer = fChannel.map(FileChannel.MapMode.READ_WRITE, 0, fChannel.size()).asIntBuffer();for (int i = 0; i < numOfInts; ++i) {intBuffer.get();}fChannel.close();  } catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}},new Tester("Stream Read/Write") {@Overridepublic void test() {RandomAccessFile raf;try {raf = new RandomAccessFile("tmp.tmp", "rw");raf.writeInt(1);for(int i = 0; i < numOfInts; ++i){raf.seek(raf.length() - 4);raf.writeInt(raf.readInt());}raf.close();              } catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}},new Tester("Map Read/Write") {@Overridepublic void test() {FileChannel fChannel;try {fChannel = new RandomAccessFile("tmp.tmp", "rw").getChannel();IntBuffer intBuffer = fChannel.map(FileChannel.MapMode.READ_WRITE, 0, fChannel.size()).asIntBuffer();intBuffer.put(1);for (int i = 1; i <= numOfInts; ++i) {intBuffer.put(intBuffer.get(i - 1));}   } catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}};public static void main(String[] args) throws IOException {for (Tester tester : tests) {tester.runTest();}}
}输出:
test  : Stream Write: : 0.06
test  : Mapped Write: : 0.01
test  : Stream Read : 0.06
test  : Map Read : 0.01
test  : Stream Read/Write : 3.43
test  : Map Read/Write : 0.01

  

转载于:https://www.cnblogs.com/E-star/p/3444057.html

Java I/O NIO学习相关推荐

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

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

  2. Java NIO学习系列五:I/O模型

    前面总结了很多IO.NIO相关的基础知识点,还总结了IO和NIO之间的区别及各自适用场景,本文会从另一个视角来学习一下IO,即IO模型.什么是IO模型?对于不同人.在不同场景下给出的答案是不同的,所以 ...

  3. Java NIO学习系列四:NIO和IO对比

    前面的一些文章中我总结了一些Java IO和NIO相关的主要知识点,也是管中窥豹,IO类库已经功能很强大了,但是Java 为什么又要引入NIO,这是我一直不是很清楚的?前面也只是简单提及了一下:因为性 ...

  4. JAVA NIO学习一:NIO简介、NIOIO的主要区别

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

  5. Java NIO学习笔记之图解ByteBuffer

    转载自 Java NIO学习笔记之图解ByteBuffer ByteBuffer前前后后看过好几次了,实际使用也用了一些,总觉得条理不够清晰. <程序员的思维修炼>一本书讲过,主动学习,要 ...

  6. Java NIO学习篇之直接缓冲区和非直接缓冲区

    定义 以上是书深入理解java虚拟机对直接内存的描述.直接缓冲区用的就是直接内存. java nio字节缓冲区要么是直接的,要么是非直接的.如果为直接字节缓冲区,则java虚拟机会尽最大努力直接在此缓 ...

  7. Java NIO学习篇之通道FileChannel详解

    定义: FileChannel是Java NIO对应于磁盘等存储设备文件操作的通道. 常用API详解: 获取FileChannel的API /** * 打开一个与文件的连接通道,用于进行文件操作. * ...

  8. Java NIO学习篇之缓冲区ByteBuffer详解

    定义: ByteBuffer是Buffer的实现类之一,是一个通用的缓冲区,功能要比其他缓冲区子类多.支持直接内存.是一个抽象类.子类实现是HeapByteBuffer(非直接缓冲区子类),Direc ...

  9. Java网络编程与NIO学习总结

    #Java网络编程与NIO学习总结 这篇总结主要是基于我之前Java网络编程与NIO系列文章而形成的的.主要是把重要的知识点用自己的话说了一遍,可能会有一些错误,还望见谅和指点.谢谢 #更多详细内容可 ...

最新文章

  1. (二)TestNG测试框架之注解及属性概览
  2. Linux中的top命令查看内存和cpu信息
  3. ElasticSearch学习29_基于Elasticsearch实现搜索推荐
  4. 孤独终老和勉强结婚,你会选什么?
  5. mysql-connector-java 6.x配置问题解决方案
  6. synchronized原理_Java并发编程—synchronized保证线程安全的原理分析
  7. 减少页面加载时间的方法
  8. TSNE—聚类结果可视化
  9. 2023CAEE安规测试与环境试验技术设备展览会
  10. 开发人员聚焦:布兰登·里德(Brandon Reid)
  11. 圣诞节,教你用Python给微信头像添加一个圣诞帽
  12. UD三分区补充教程1——激活不同分区对于UD三分区bios启动和uefi启动兼容性影响的讨论
  13. 必看外国电影一百部,中国电影五十部
  14. linux怎么查看当前系统版本号,如何查看当前系统版本的版本号
  15. FinFET基础知识合集
  16. 上手基金,看这一篇就够了
  17. excel中如何实现在年龄一栏加1即让某列数字分别加1
  18. PRIMARY KEY,key,unique key
  19. 推荐一款强大的3D家装开源软件
  20. 机器学习 -- 二元逻辑回归实例

热门文章

  1. 震惊!!!这才是代码!!
  2. CV算法助理 | 华为外包招聘
  3. 旷视开源了一套图像检索和ReID的PyTorch库
  4. ICCV 2019 | ActivityNet 挑战赛冠军方案—时序动作提名,边界匹配网络详解
  5. 计算机等级考试二级Python讲座(一)
  6. python 基础 - 循环语句
  7. 学计算机三本大学最低分数线,2018三本大学最低录取分数线是多少
  8. 谷歌、DeepMind提出高效Transformer评估基准
  9. oracle导入字符集,Oracle导入字符集问题
  10. ResNet到底深不深?