Java NIO是什么

  介绍

这篇文章主要介绍Java NIO是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

Java NIO主要需要理解缓冲区,通道,选择器三个核心概念,作为对Java I/O的补充,以提升大批量数据传输的效率。

学习NIO之前最好能有基础的网络编程知识

Java I/O流

Java网络编程

Java NIO:缓冲区

通道(频道)作为NIO的三大核心概念之一(缓冲区,通道,选择器),用于在字节缓冲区与位于通道另一侧的实体(文件或者套接字)之间有效的传输数据(核心是传输数据)

NIO编程的一般模式是:把数据填充到发送字节缓冲区——比;通过通道发送到通道对端文件或者套接字

<强>通道基础

使用通道的目的是进行数据传输,使用前需要打开通道,使用后需要关闭通道

<>强打开通道

我们知道I/O有两大类:文件IO和I/O流,其对应到通道也就有文件通道(FileChannel)和套接字通道(SocketChannel、ServerSocketChannel DatagramChannel)两种

对于套接字通道,使用静态工厂方法打开

SocketChannel sc=SocketChannel.open ();   ServerSocketChannel sc=ServerSocketChannel.open ();   DatagramChannel sc=DatagramChannel.open ();

对于文件通道只能通过对一个RandomAccessFile, FileInputStream, FileOutputStream对象调用getChannel()方法获取

FileInputStream=新FileInputStream (“/tmp/a.txt");   FileChannel fc=in.getChannel ();

<强>使用通道进行数据传输

下段代码首先将要写入的数据放到ByteBuffer中,然后打开文件通道,把缓冲区中的数据放到文件通道。

//准备数据并放入字节缓冲区   ByteBuffer男朋友=ByteBuffer.allocate (1024);   bf.put(“我cool" .getBytes ());   bf.flip ();//打开文件通道   FileOutputStream=新FileOutputStream (“/tmp/a.txt");   FileChannel fc=out.getChannel ();//数据传输   fc.write (bf);//关闭通道   fc.close ();

<强>关闭通道

如同插座,FileInputStream等对象使用完毕之后需要关闭一样,通道使用之后也需要关闭。一个打开的通道代表与一个特定I/O服务的特定连接并封装该连接的状态,通道关闭时连接丢失,不再连接任何东西。

<>强阻塞,非阻塞模式

通道有阻塞和非阻塞两种运行模式,非阻塞模式的通道永远不会休眠,请求的操作要么立即完成,要么返回一个结果表明未进行任何操作(具体看插座通道处的描述)。只有面向流的通道可使用非阻塞模式

<强>文件通道

文件通道用于对文件进行访问,通过对一个RandomAccessFile, FileInputStream, FileOutputStream对象调用getChannel()方法获取。调用getChannel方法返回一个连接到相同文件的FileChannel对象,该FileChannel对象具有与文件对象相同的访问权限。

<强>文件访问

使用文件通道的目的还是对文件进行读写操作,通道的读写api如下:

公共抽象int读(ByteBuffer dst)抛出IOException;   公共抽象int写(ByteBuffer src)抛出IOException;

下面是一段读取文件的演示

//打开文件通道   RandomAccessFile f=新RandomAccessFile (“/tmp/a.txt",“r");   FileChannel fc=f.getChannel ();//从通道中读取数据,直到文件尾   ByteBuffer bb=ByteBuffer.allocate (1024);   而(fc.read (bb) !=1) {   ;   }//翻转(读之前需要先进行翻转)   bb.flip ();   StringBuilder builder=new StringBuilder ();//把每一个字节转为字符(ascii编码)   而(bb.hasRemaining ()) {   builder.append ((char) bb.get ());   }   System.out.println (builder.toString ());

上面这个演示有个问题:我们只能读取字节,然后由应用程序去解码,这个问题我们可以通过工具类渠道将通道包装成读者和作家来解决;当然我们也可以直接使用Java I/O流模式的读者和作家操作字符

<强>文件通道位置与文件空洞

文件通道位置(位置)就是普通文件的位置,位置的值决定了文件中哪个位置的数据接下来将被读或者写

读取超出文件尾部位置的数据会返回1(文件EOF)

往一个超出文件尾部的位置写入数据会造成文件空洞:比如一个文件现在有10个字节,但是此时往位置=20处写入数据就会造成10 ~ 20之间的位置是没有数据的,这就是文件空洞

<>力量雄厚操作

力操作强制通道将全部修改立即应用到磁盘文件(防止系统宕机导致修改丢失)

Java NIO是什么