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

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. https笔记

    TCP提供了可靠的,面向连接的字节流服务. 1)应用数据分割成TCP认为适合发送的数据块,通过MSS(最大数据包长度)来控制. 2)重传机制 3)对首部和数据进行校验 4)TCP对收到的数据进行排序, ...

  2. jquery,返回到顶部按钮

    HTML: <footer> <a href="#" class="top">↑</a> </footer> C ...

  3. Zend Studio实用快捷键一览表

    CTRL+B | 重构项目CTRL+D | 删除一行CTRL+E | 搜索已打开的文件名CTRL+F | 打开本文件的搜索/替换 ,只搜索当前文件CTRL+H | 打开搜索替换窗口 ,可搜索整个磁盘. ...

  4. PHP的Socket通信之UDP篇

    1.创建一简单的UDP服务器 //服务器信息 $server = 'udp://127.0.0.1:9998'; //消息结束符号 $msg_eof = "\n"; $socket ...

  5. C语言中%*s,%*c 是什么意思(还有%*.*s)

    在 scanf 和 printf 里效果是不一样的. 在printf,动态控制显示格式用的 printf("%*s",5,"123");执行一下,这条语句,输出 ...

  6. load-on-startup

    在servlet的配置当中,<load-on-startup>1</load-on-startup>,一般出现在启动线程的servlet当中 含义是: 标记容器是否在启动的时候 ...

  7. sql截断日志

    --收缩数据库 DBCC SHRINKDATABASE(fas) --截断事务日志: BACKUP LOG fas WITH NO_LOG 1.清空日志 DUMP TRANSACTION 库名 WIT ...

  8. xheditor上传图片配置

    二. 源码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Xeditor.a ...

  9. c#代码画图

    说明:此示例代码在我做的一个项目中  不过还是可以学习一下 一:直角坐标系显示数据 先看效果图:

  10. 最长递增子序列LIS再谈

    DP模型: d(i) 以第 i 个元素结尾的最长递增子序列的长度. 那么就有 d(i) = max(d(j)) + 1;(j<i&&a[j]<a[i]),答案 max(d( ...