关闭

Java中的NIO使用

295人阅读 评论(0) 收藏 举报

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() ;
     
      }
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:9344次
    • 积分:145
    • 等级:
    • 排名:千里之外
    • 原创:6篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章存档
    最新评论