NIO入门

Wesley13
• 阅读 788

1、I/O输入输出,所有的IO都被视作是单个字节的移动,通过stream对象一次移动一个字节。流IO负责把对象转换为字节,然后再转换为对象。

NIO提供了二套NIO,一套是针对标准输入输出NIO,另一套是网络编程NIO

2、流与块的比较

NIO和IO最大的区别是数据打包和传输方式,IO是以流的方式来处理数据,而NIO是以块的方式处理数据。 面向块的IO系统以块的形式处理数据,

每一个操作都在一步中产生或消费一个数据块。按块要比按流快的多

3、NIO基础

buffer和channel是标准NIO中核心对象(网络NIO还有一个Selector核心对象)channel是对原io中流的模拟,任何来源和目的数据都必须通过一个channel对象,

一个buffer实质上是一个容器对象,发给channel的所有对象都必须先放到buffer中,同样的,从channel中读取的任何数据都要读到buffer中

3.1 buffer

buffer是一个对象,包含一些要写入或读出的数据。在NIO中,数据是放入buffer对象的,而在IO中,数据是直接写入或者读到stream对象的。应用程序不能直接对channel进行读写操作,而必须通过buffer来进行,即channel是通过buffer来读写数据的。 在NIO中,所有的数据都是用buffer处理的,是NIO读写数据的中转池。buffer实质上是一个数组,通常是一个字节数据,但也可以是其他类型的数组但一个缓冲区不仅仅是一个数组,重要的是它提供了对数据的结构化访问,而且还可以

跟踪系统的读写进程

buffer: 读写数据一般四个步骤:

1)写入数据到buffer

2) 调用flip方法

3)从buffer中读取数据

4)调用clear方法或者compact方法

当向buffer写入数据时,buffer会记录下写了多少数据。一旦要读取数据,需要通过flip方法将buffer从写模式切换到读模式。在读模式下,可以读取之前写入到buffer的所有数 据。一旦读完了所有的数据,就需要情况缓冲区,让它可以再次被写入。有二种方式能清空缓冲区clear或compact方法。clear会清空整个缓冲区,compact知会清除已经读过得数据。任何未读的数据都被移到缓冲区的起始处,新写入的数据将放到缓冲区未读数据的后面

3.2 channel,可以通过它读取和写入数据。

1)channel是双向的,既可以读也可以写,而流是单向的

2) channel可以进行异步的读写

3) 对channel的读写必须通过buffer对象

在NIO中channel主要有如下几种类型:

1)FileChannel:从文件读取数据

2) DatagramChnanel : 读写UDP忘了协议数据

3) SocketChannel : 读写TCP忘了协议数据

4) ServerSocketChannel : 可以监听tcp连接

NIO中读和写:

4.1 从文件中读取

1)从FileInputStream读取channel

2)创建buffer

3)从channel读取数据到buffer

FileInputStream fin = new FileInputStream("readme.txt");

FileChannel channel = fin.getChannel();

//创建缓冲区

ByteBuffer buffer = ByteBuffer.allocate(1024);

channel.read(buffer);

4.2 写入数据到文件

FileOutputStream fos = new FileOutputStream("out.txt");

FileChannel channel = foc.getChannel();

ByteBuffer buffer = ByteBuffer.allocate(1024);

for(int i=0; i < message.length; ++i){

buffer.put(message[i]);

}

channel.write(buffer);

4.3 读写结合demo

创建一个buffer 然后从源文件读取数据到缓冲区,然后再从缓冲区写入目标文件

public static void copyFileUseNIO(String src, String dst) throws Exception{

FileInputStream fis = new FileInputStream(new File(src));

FileOutputStream fos = new FileOutputStream(new File(dst));

FileChannel inchannel = fis.getChannel();

FileChannel outChannel = fos.getChannel();

ByteBuffer buffer = ByteBuffer.allocate(1024);

while(true){

int eof = inchannel.read(buffer);

if(eof == -1) {

break;

}

//重设一下buffer的position=0,limit=position

buffer.flip();

outchannel.write(buffer);

//写完要重置buffer,重设position=0,limit=capacity

buffer.clear();

}

finChannel.close();

fosChanenl.close();

fis.close();

fos.close();

}

点赞
收藏
评论区
推荐文章
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
javaIO2
NIO新的输入/输出(NIO)库是在JDK1.4中引入的,弥补了原来的I/O的不足,提供了高速的、面向块的I/O。1.1流与块I/O与NIO最重要的区别是数据打包和传输的方式,I/O以流的方式处理数据,而NIO以块的方式处理数据。面向流的I/O一次处理一个字节数据:一个输入流产生一个字
Wesley13 Wesley13
3年前
Java NIO和IO的区别
IO               NIO面向流           面向缓冲阻塞IO           非阻塞IO无               选择器面向流与面向缓冲JavaNIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。JavaIO面向流意味着每次从流中
Wesley13 Wesley13
3年前
JAVA NIO(一)
1NIO概述1.1NIO(newIO)是一个可以替代javaIOAPI的API,NIO提供了与标准IO不同的工作方式,标准IO是基于字节流和字符流进行操作的,而NIO是基于channel和Buffer进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写到通道中,方式如例图示,JAVANIO的几个核心组成部分是channels,Buf
Wesley13 Wesley13
3年前
Java NIO:IO与NIO的区别
 一、概念    NIO即NewIO,这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多。在JavaAPI中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。二、NIO和IO的主要区别下表总结了JavaIO和NIO之
Wesley13 Wesley13
3年前
JAVA NIO入门(一)
一、JAVANIO概念  JAVANIO是从JDK1.4就开始有的,之前只用过IO流,其实NIO和IO一样都是可以用来读取或者写入文件,只不过原来的IO是面向流进行操作的,而NIO是面向缓冲区进行操作二、通过一个小例子初步了解下NIO如何进行文件读写 !(https://oscimg.oschina.net/oscnet/
Wesley13 Wesley13
3年前
Java输入输出流
1.什么是IO   Java.io是大多数面向数据流的输入/输出类的主要软件包。此外,Java也对块传输提供支持,在核心库java.nio中采用的便是块IO。  流IO的好处是简单易用,缺点是效率较低。块IO效率很高,但编程比较复杂。   JavaIO模型 :   Java的IO
Wesley13 Wesley13
3年前
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
3年前
Java NIO之缓冲区
JavaNIO之Buffer  Java传统的I/O模型是面向单个字节的,它将输入输出抽象为字节流或字符流。这种单个字节的读取或写入模型的效率比较低,而且不符合操作系统的I/O特点。操作系统的IO是面向字节块的,通常是直接从磁盘中读取一块数据到内存或写入一块数据到磁盘。JavaNIO提供了缓冲区来实现字节块的读写。
Wesley13 Wesley13
3年前
Java Nio
(1)NIOa)  Nio之所以比旧的io速度快是因为,nio使用的结构更接近于系统操作执行io的操作:通道和缓冲器.(2)如何操作nio读写数据Nio读写方式可以想象成:数据源和数据目的地是煤矿与煤场,通道想象成告诉公路,缓冲器是卡车,nio中的FileChannel是装卸煤用的工具,ByteBuffer是装煤用的卡车.在新的io中我们不对通道