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 ...
随机推荐
- android 之 Crash信息的持久化处理
需求: 持久化运行时异常的信息 1.CrashHandler.java import android.content.Context; import android.content.pm.Packag ...
- struts2上传
注意事项:文件名必须是:文件域+FileName,如: // 封装上传文件域的属性 private File uploadImage; // 封装上传文件名的属性 private String upl ...
- 自定义Exception
本文改编自http://blog.csdn.net/stellaah/article/details/6738424 [总结] 1.自定义异常: class 异常类名 extends Exceptio ...
- PHP中判断字符串是否含有中文
<?php /** * [1.测试一] * 当$str = '中文测试'; 时输出"全部是汉字";当$str = '中a文3测试'; 时输出"不全是汉字" ...
- MVP+RXJAVA+RecyclerView实现sd卡根目录下的所有文件中的照片加载并显示
初学Rxjava,目前只能遍历加载指定目录下的所有文件夹中的照片,文件夹中如果还嵌套有文件夹目前还没找到实现方法. 先看mvp目录结构: 很抱歉,没有model. 接下来是view层的接口代码和pre ...
- quick lua 3.3常用方法和学习技巧之functions.lua目录
1.functions.lua (framework->functions.lua) 提供一组常用函数,以及对 Lua 标准库的扩展 1.printf 2.checknumber checkin ...
- [团队项目] Scrum 项目 2.0 产品BACKLOG
Scrum 项目 2.0 阅读教材第8章,8.1~8.3节 P157~168,了解获取用户需求的办法,每个组可以选择一二加以应用. 8.4节P168-171 查阅NABCDA模型的具体说明. 2.SC ...
- 从客户端中检测到有潜在危险的 Request.Form 值
今天在使用Kindeditor的时候,出现了如题的错误. 错误如图: 百度了下,艰难的找了原来是Framework的问题,原来用的2.0,后面变成了4.0,验证级别也更高了: 解决办法:在config ...
- Java -Dfile.encoding=UTF-8 出现乱码问题原因分析
这两天写了一个 Java 程序来玩,结果又遭遇了以前遇到过很多次的乱码问题,具体描述一下: 在 Mac 系统里面,常用的 Java 程序启动方式有如下几种: 1.通过 eclipse 执行 class ...
- [转]Unity3D:Gizmos画圆(原创)
using UnityEngine; using System; public class HeGizmosCircle : MonoBehaviour { public Transform m_Tr ...