Java I/O NIO学习
给出一个学习的链接讲的很全。。
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学习的更多相关文章
- JAVA NIO学习一:NIO简介、NIO&IO的主要区别
在前面学习了IO之后,今天我们开始进入NIO学习环节,首先我们会NIO做一个简单的介绍,让大家认识NIO,然后会和IO进行一个对比认识进行区分.好了,下面我们就开始学习: 一.NIO简介 1.概述 从 ...
- Java NIO学习与记录(八): Reactor两种多线程模型的实现
Reactor两种多线程模型的实现 注:本篇文章例子基于上一篇进行:Java NIO学习与记录(七): Reactor单线程模型的实现 紧接着上篇Reactor单线程模型的例子来,假设Handler的 ...
- Java NIO学习笔记
Java NIO学习笔记 一 基本概念 IO 是主存和外部设备 ( 硬盘.终端和网络等 ) 拷贝数据的过程. IO 是操作系统的底层功能实现,底层通过 I/O 指令进行完成. 所有语言运行时系统提供执 ...
- 零拷贝详解 Java NIO学习笔记四(零拷贝详解)
转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ...
- Java NIO 学习笔记(七)----NIO/IO 的对比和总结
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- Java NIO 学习笔记(六)----异步文件通道 AsynchronousFileChannel
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- Java NIO 学习笔记(五)----路径、文件和管道 Path/Files/Pipe
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- Java NIO 学习笔记(四)----文件通道和网络通道
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- Java NIO 学习笔记(三)----Selector
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
随机推荐
- org.apache.cxf.transport.servlet.CXFServlet cannot be cast to javax.servlet.Servlet
java.lang.ClassCastException: org.apache.cxf.transport.servlet.CXFServlet cannot be cast to javax.se ...
- iOS直播的技术分析与实现
HTTP Live Streaming直播(iOS直播)技术分析与实现 发布于:2014-05-28 13:30阅读数:12004 HTTP Live Streaming直播(iOS直播)技术分析与实 ...
- Oracle存储过程单步调试方法
oracle存储过程单步调试的方法 1.在要调试的过程上单击test,如下图所示: 2.出现如下界面时单击最左上方的按钮:,如下图所示: 3.单击后呈现如下画面: 其中: 表示要停止test; 表示要 ...
- C#字符串题目
老师给小学生门布置了一些作业,让它们按照一个模版写一些字符串交上来,同学们把作业交上来了,问题来了,这么多的作业老师批改不过来,现在请你帮老师写一个程序,帮助老师确定各个字符串是否合格.首先老师有一个 ...
- Kernel启动时 驱动是如何加载的module_init,加载的次序如何;略见本文
Init.h中有相关initcall的启动次序,在system.map中可看出具体的__initcall指针的前后次序 #define pure_initcall(fn) __define_initc ...
- java提高篇---HashTable
在java中与有两个类都提供了一个多种用途的hashTable机制,他们都可以将可以key和value结合起来构成键值对通过put(key,value)方法保存起来,然后通过get(key)方法获取相 ...
- (1)redis下载编译
一.redis下载编译 这里没什么好说的 用的版本是redis-2.8.17 1)redis-server是可执行程序 2)mian函数在redis.c里面 3)如果要修改调试 这届在src目录下 ...
- 关于C指针
地址概念:内存基本单元是一个字节,一个字节8个位.在定义变量的时候,如int a=10:系统为变量a分配2个字节空间:1000~1001,并在1001~1002中存有数据10.内存中没有变量a,只有1 ...
- JavaScript的循环语句
JavaScript的循环语句 1.JavaScript的循环语句 (1)for循环语句 - 循环代码块一定的次数: (2)for/in循环语句 - 循环遍历对象的属性: (3)while循环语句 - ...
- CodeForces 651B Beautiful Paintings 贪心
A. Joysticks time limit per test 1 second memory limit per test 256 megabytes input standard input o ...