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 ...
随机推荐
- Mysql服务器相互作用的通讯协议包括TCP/IP,Socket,共享内存,命名管道
MySQL实现了四种通信协议 TCP/IP协议,通常我们通过来连接MySQL,各种主要编程语言都是根据这个协议实现了连接模块 Unix Socket协议,这个通常我们登入MySQL服务器中使用这个协议 ...
- Content Delivery Network
Coding Standards & Best Practices 7 Reasons to use a Content Delivery Network CDN公共库汇总
- WinCE Show App Icon
找个图片,例如背景透明的jpg或png,上http://www.pic2icon.com/smartphone_wince_icon_generator.php这个网站转换下. 在项目属性中,设为图标 ...
- Docker第三方项目小结
软件项目的成功常常根据其催生的生态系统来衡量.围绕或基于核心技术构建的项目增添了功能和易用性,它们常常日臻完善.Docker就是一个典例,有众多第三方项目扩展.补充或改进Docker. •Docker ...
- 给windows服务打包,并生成安装程序
一. 添加新建项目-->安装部署-->安装项目 二.安装程序上-->右键视图-->文件系统-->应用程序文件夹-->右键-->添加项目输出 选择做好的wind ...
- PHP过滤评论关键词
<?php /** * PHP中屏蔽过滤指定关键字实现方法总结 * http://www.111cn.net/phper/phpanqn/46225.htm * * 思路: * 一.把关键字专门 ...
- C#:控制台程序调用中间库创建窗体
1.类库项目引用System.Windows.Forms并添加引用后,才可创建窗体. 2.控制台应用程序调用中间库(DLL)中的方法创建窗体:中间类库使用反射下的Assembly加载包含窗体的类库及创 ...
- HDU 4706:Children's Day
Children's Day Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- Boring count(字符串处理)
Boring count Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- Apache common pool2 对象池
对象池的容器:包含一个指定数量的对象.从池中取出一个对象时,它就不存在池中,直到它被放回.在池中的对象有生命周期:创建,验证,销毁,对象池有助于更好地管理可用资源,防止JVM内部大量临时小对象,频繁触 ...