Java中的NIO使用

原创 2013年12月05日 22:45:26

No.one: 什么是NIO?

新的输入/输出 (NIO) 库是在 JDK 1.4 中引入的。NIO 弥补了原来的 I/O 的不足,它在标准 Java 代码中提供了高速的、面向块的 I/O就是NIO.

No.two:理解:

讲得很抽象吧我们来理解一下以前我们使用的IO都是以流的形式读取数据流读取的原理是一次一个字节地读数据,一个输入流产生和一个字节的数据一个输出流消费一个字节的数据缺点速度慢优点过滤非常容易.

现在, NIO的出现弥补了这个缺点,  面向块  I/O 系统以块的形式处理数据。每一个操作都在一步中产生或者消费一个数据块。按块处理数据比按(流式的)字节处理数据要快得多。但是面向块的 I/O 缺少一些面向流的 I/O 所具有的优雅性和简单性。 块是以字节数组读取数据的流是以字节读取数据的想想是不是快了不止一个级别.其次NIO不能代替原有的IO,只能相互弥补就跟AOPOOP 一样.

No.three:NIO原理和API:

NIO我们读和些的数据都是放在Buffer读数据先通过通道加载到Buffer写入的数据也是如此我们所说的Buffer 实际上时一个数组一个字节(byte)数组 , 注意 : 一个Buffer不仅仅是一个数组缓冲区提供了对数据的结构化访问.

最常用的缓冲区类型是ByteBuffer,一个 ByteBuffer 可以在其底层字节数组上进行 get/set 操作(即字节的获取和设置)

ByteBuffer不是 NIO 中唯一的缓冲区类型。事实上,对于每一种基本 Java 类型都有一缓冲区类型,:                             

ByteBuffer                                       

CharBuffer                                                                  

ShortBuffer

IntBufferLongBuffer

FloatBuffer                                      

DoubleBuffer

但我们通常使用ByteBuffer就够了.

好了闲话少说下面是以个文件复制的例子:

CopFIle.java

 

import java.io.*;
import java.nio.*;
import java.nio.channels.*;
/**
 * 使用Nio实现文件复制
 * @author 神
 */
public class CopyFile {
     
      public static void main(String[] args) throws Exception {
           // TODO Auto-generated method stub
           String fileone = "f:/fileone.txt" ;
           String filetwo =  "f:/filetwo.txt" ;
           //将文件加载到字节流中
           FileInputStream fin = new FileInputStream(fileone);
           //要输出的目标文件
           FileOutputStream fout = new FileOutputStream(filetwo);
          //得到nio对象
           FileChannel fcin = fin.getChannel() ;
           FileChannel fcout =fout.getChannel() ;   
           //开辟一个1024大小的缓冲
           ByteBuffer buffer = ByteBuffer.allocate(1024);
           while(true){
                 buffer.clear() ;
                 int i =  fcin.read(buffer) ;
                 if(i == -1){
                      break ;
                 }
                 //准备写到输出块中
                 buffer.flip() ;
                 //将fileone.txt中的内容写到filetwo.txt中
                 fcout.write( buffer );
                  
           }
           fin.close();
           fcin.close();
           fout.close();
           fcout.close() ;
     
      }
}


JAVA中NIO的使用方法及其功能详解

简介 Java世界中的两类IO:IO(性能瓶颈)和NIO以及jdk1.7中要加入的增强版NIO •IO:面向流的方式处理数据(单个的字节,字符的移动,流的一次操作一次只能产生或者消费一个字节或者字...
  • luo_yifan
  • luo_yifan
  • 2012年03月12日 11:37
  • 2337

Java NIO之Selector的使用

看了下关于Selector的使用方法,官方的说法是一个“多路复用器”,从我自己的角度来讲就感觉像一个服务总线,负责统一各个处理程序的消息注册,统一接收客户端或服务器消息信息,再分发给不同的事件处理程序...
  • zmx729618
  • zmx729618
  • 2016年07月08日 11:10
  • 2363

Java NIO理解与使用

Netty的使用或许我们看着官网user guide还是很容易入门的。因为java nio使用非常的繁琐,netty对java nio进行了大量的封装。对于Netty的理解,我们首先需要了解NIO的原...
  • qq_18860653
  • qq_18860653
  • 2016年11月30日 14:02
  • 2868

java nio 基础之Select 用法

本文参考至Java Nio 基础教程 Select (选择器)是Java Nio中能够检测一个到多个通道,并能够知道是否为诸如读写事件做好准备的组件。 这样,一个单独的线程就可以管理多个chann...
  • zhouzhiwengang
  • zhouzhiwengang
  • 2017年06月04日 17:24
  • 459

全面解读Java NIO工作原理(一)

本文简介: JDK 1.4 中引入的新输入输出 (NIO) 库在标准 Java 代码中提供了高速的、面向块的 I/O。本实用教程从高级概念到底层的编程细节,非常详细地介绍了 NIO 库。您将学到诸如缓...
  • pfnie
  • pfnie
  • 2016年06月16日 12:44
  • 821

JAVA NIO(一):Buffer.mark()的用法

在默认情况下,Buffer.mark()并没有什么用处,既不会影响Buffer的遍历,也不会影响Buffer的位置统计函数,如remaining()函数,能影响这些操作的行为只有position()。...
  • yiifaa
  • yiifaa
  • 2017年07月27日 23:32
  • 323

Android使用NIO开发客户端

SocketUtil.java 001 package com.lee.ademo.net; 002   003 import ...
  • lh15871815717
  • lh15871815717
  • 2014年12月23日 10:47
  • 11178

javaNIO中ByteBuffer用法

ByteBuffer类是在javaNIO中常常使用的一个缓冲区类,使用ByteBuffer可以进行高效的IO操作 下来我们看一下ByteBuffer类的常用方法: ByteBuffer.alloc...
  • mingming_shiwo
  • mingming_shiwo
  • 2017年04月13日 17:43
  • 746

java:NIO读写文件的示例

Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。 NIO方式读数据非常简单 创建一个缓冲区(ByteBuffer);通...
  • 10km
  • 10km
  • 2016年07月04日 19:00
  • 2355

Java的NIO及与IO区别

请参阅:Java NIO 系列教程NIO初窥 Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API NIO和IO主要区别 ...
  • u012440687
  • u012440687
  • 2016年09月25日 14:18
  • 750
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java中的NIO使用
举报原因:
原因补充:

(最多只允许输入30个字)