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

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置0
bf.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:") {
@Override
public 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 block
e.printStackTrace();
}
}
}, new Tester("Mapped Write:") {
@Override
public 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 block
e.printStackTrace();
} } catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, new Tester("Stream Read") { @Override
public 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 block
e.printStackTrace();
} }
},new Tester("Map Read") { @Override
public 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 block
e.printStackTrace();
}
}
},
new Tester("Stream Read/Write") { @Override
public 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 block
e.printStackTrace();
}
}
},
new Tester("Map Read/Write") { @Override
public 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 block
e.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

  

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. android 开发中的常见问题

    Android studio 使用极光推送, 显示获取sdk版本失败 在 build.gradle(Module.app) 添加 android {    sourceSets.main {      ...

  2. OpenCV学习 物体检测 人脸识别 填充颜色

    介绍 OpenCV是开源计算机视觉和机器学习库.包含成千上万优化过的算法.项目地址:http://opencv.org/about.html.官方文档:http://docs.opencv.org/m ...

  3. MySQL对于数据库应该如何如何配置安全问题了

    mysql 是完全网络化的跨平台关系型数据库系统,同时是具有客户机/服务器体系结构的分布式数据库管理系统.它具有功能强.使用简便.管理方便.运行速度快.安全可靠性强等优点,用户可利用许多语言编写访问m ...

  4. SQL Server 2005 日志文件过大处理

    由于安装的时候没有计划好空间,默认装在系统盘,而且又没有做自动备份.截断事务日志等,很快LDF文件就达到十几G,或者几十G ,此时就不得不处理了. 备份和计划就不说了,现在就说下怎么把它先删除吧: 1 ...

  5. android技术总结

    1.要做一个尽可能流畅的ListView,你平时在工作中如何进行优化的? ①Item布局,层级越少越好,使用hierarchyview工具查看优化. ②复用convertView ③使用ViewHol ...

  6. 去掉DataTable中重复的行

    //DataView dv = dt3.DefaultView;     //dt3默认的虚拟视图 //dv.Sort = "wmid asc"; //排序 ///dv.ToTab ...

  7. YTU 2924: 文件操作--二进制文件读入

    2924: 文件操作--二进制文件读入 时间限制: 1 Sec  内存限制: 128 MB 提交: 58  解决: 20 题目描述 现有100名学生的姓名(name).学号(num).英语(Engli ...

  8. C# 单例模式Lazy<T>实现版本

    非Lazy版本的普通单例实现: public sealed class SingletonClass : ISingleton { private SingletonClass () { // the ...

  9. Wireless Network

    Wireless Network Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 19626 Accepted: 8234 De ...

  10. MFC编程基础

    http://www.cnblogs.com/lzmfywz/archive/2012/03/15/2399403.html 一.MFC类库概述 MFC(Microsoft Foundation cl ...