JAVA NIO入门(一)

Wesley13
• 阅读 498

一、JAVA NIO概念

  JAVA NIO是从JDK1.4就开始有的,之前只用过IO流,其实NIO和IO一样都是可以用来读取或者写入文件,只不过原来的IO是面向流进行操作的,而NIO是面向缓冲区进行操作

二、通过一个小例子初步了解下NIO如何进行文件读写 

JAVA NIO入门(一) JAVA NIO入门(一)

package com.boke.nio.base;

import java.io.File;
import java.io.FileInputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * 原IO和NIO分别实现读取、写入文件
 * @author lenovo
 *
 */
public class MyFirstNio {
    
    public static void main(String[] args) throws Exception {
        File file = new File("C:/Users/lenovo/Desktop/test.txt");
        readio(file);//原IO
        readnio(file);//NIO
    }
    
    
    //原IO进行文件读操作
    public static void readio(File file) throws Exception{
        FileInputStream fis = new FileInputStream(file);
        byte[] arr = new byte[1024];
        int len = -1;
        System.out.println("原IO:");
        while((len = fis.read(arr))!=-1){
            System.out.println(new String(arr,0,len,"utf-8"));
        }
        
        if(fis!=null){
            fis.close();
        }
    }
    
    //NIO方式进行文件读操作
    public static void readnio(File file) throws Exception{
        FileInputStream fis = new FileInputStream(file);
        FileChannel channel = fis.getChannel();//通过流获取唯一通道
        ByteBuffer buffer  = ByteBuffer.allocate(1024);//创建一个缓冲区
        
        System.out.println("NIO:");
        while (true) {  
            // clear方法重设缓冲区,使它可以接受读入的数据  
            buffer.clear();  
  
            // 从输入通道中将数据读到缓冲区  
            int r = channel.read(buffer);  
  
            // read方法返回读取的字节数,可能为零,如果该通道已到达流的末尾,则返回-1  
            if (r == -1) {  
                break;  
            }  
            
            byte[] array = buffer.array();
            System.out.println(new String(array,0,r,"utf-8"));
        }  
        
        if(fis!=null){
            fis.close();
        }
        
    }
}

View Code

  通过上面的例子,可以很明显的看出IO和NIO一个最大的区别,IO是直接将数据读取至流中,而NIO数据终将在缓冲区中

三、根据例子对NIO关键概念进行讲解

(1)例子中的FileChannel

通道,可以理解为它就是原IO中的流,但是读取的数据不是放在流中,而必须通过channel.read(buffer)将数据读取到缓冲区buffer中,如果取数据的话也是先将数据放至缓冲区中。

通道与流的不同之处在于通道是双向的。而流只是在一个方向上移动(一个流必须是InputStream或者OutputStream的子类), 而通道可以用于读、写或者同时用于读写。因为它们是双向的,所以通道可以比流更好地反映底层操作系统的真实情况。特别是在UNIX模型中,底层操作系统通道是双向的。

(2)例子中的ByteBuffer

说明一下,ByteBuffer并不是NIO中唯一的缓冲区类型,是使用最多的一种缓冲区类型,当然还有其他缓冲区对象,只是类型不同而已,包括:

ByteBuffer 
       CharBuffer 
       ShortBuffer 
       IntBuffer 
       LongBuffer 
       FloatBuffer 
       DoubleBuffer

缓冲区实质上是一个数组。通常它是一个字节数组,但是也可以使用其他种类的数组。但是一个缓冲区不仅仅是一个数组。每一个缓冲区都有复杂的内部统计机制,接下来我会开始了解一下。

   标记下:上面如果看完不是很明白的话可以看看 http://zhangshixi.iteye.com/blog/679959作者的系列文章即可

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
2年前
NIO入门
1、I/O输入输出,所有的IO都被视作是单个字节的移动,通过stream对象一次移动一个字节。流IO负责把对象转换为字节,然后再转换为对象。NIO提供了二套NIO,一套是针对标准输入输出NIO,另一套是网络编程NIO2、流与块的比较NIO和IO最大的区别是数据打包和传输方式,IO是以流的方式来处理数据,而NIO是以块的方式处理数据。面向块的IO
Wesley13 Wesley13
2年前
Java NIO和IO的区别
IO               NIO面向流           面向缓冲阻塞IO           非阻塞IO无               选择器面向流与面向缓冲JavaNIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。JavaIO面向流意味着每次从流中
Wesley13 Wesley13
2年前
JAVA NIO(一)
1NIO概述1.1NIO(newIO)是一个可以替代javaIOAPI的API,NIO提供了与标准IO不同的工作方式,标准IO是基于字节流和字符流进行操作的,而NIO是基于channel和Buffer进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写到通道中,方式如例图示,JAVANIO的几个核心组成部分是channels,Buf
Wesley13 Wesley13
2年前
Java NIO学习笔记
JavaNIO是什么JavaNIO(NewIO)是从Java1.4版本开始引入的一个新的IOAPI,可以替代标准的JavaIOAPI。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的、基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操作。JavaNIO与IO
Wesley13 Wesley13
2年前
Java Nio 线程
JavaNIO(NewIO)是从Java1.4版本开始引入的 一个新的IOAPI,可以替代标准的JavaIOAPI。 NIO与原来的IO有同样的作用和目的,但是使用 的方式完全不同,NIO支持面向缓冲区的、基于 通道的IO操作。NIO将以更加高效的方式进行文 件的读写操作JavaNIO与IO的主要区别
Stella981 Stella981
2年前
Netty之缓冲区ByteBuf解读(一)
!(https://oscimg.oschina.net/oscnet/up6de4d71f462d9846befe00ec6505125a928.JPEG)\Netty在数据传输过程中,会使用缓冲区设计来提高传输效率。虽然,Java在NIO编程中已提供ByteBuffer类进行使用,但是在使用过程中,其编码方式相对来说不太友好,也
Wesley13 Wesley13
2年前
Java IO之NIO原理解析以及代码演示
一、JavaNIO几个核心部分ChannelBufferSelector二、IO和NIO的区别IO基于流(Streamoriented),而NIO基于Buffer(Bufferoriented)在一般的JavaIO操作中,我们以流式的方式顺序地从
Wesley13 Wesley13
2年前
NIO
1、简介1.1Java中的IO介绍1.BIO:BlockingIO,同步式阻塞式IO,即传统的IO,是java中最早期的流2.NIO:NonBlockingIO,又称NewIO,同步式非阻塞IO,是JDK1.4提供的流3.AIO:AsynchronousIO,异步是非阻塞IO,可以认为是NIO的二代版
Wesley13 Wesley13
2年前
NIO 非阻塞IO
NIO与IO的区别NIO特点:非阻塞,面向缓冲区IO特点:阻塞式,面向流阻塞与非阻塞javaio是阻塞式的,当一个线程调用read或者write方法后开始阻塞,直到读取到数据或者写入数据完成,该线程一直处于阻塞状态不能做其他事情。javanio通过选择器实现非阻塞式IO,通过一个专门的选