java_nio编程(一)
概述
NIO 和 BIO 有着相同的目的和作用, 但是它们的实现方式完全不同, BIO 以流的方式处理数据,而 NIO 以块的方式处理数据,块 I/O 的效率比流 I/O 高很多。另外, NIO 是非阻塞式的,这一点跟 BIO 也很不相同, 使用它可以提供非阻塞式的高伸缩性网络。NIO 主要有三大核心部分: Channel(通道), Buffer(缓冲区), Selector(选择器)。 传统的 BIO基于字节流和字符流进行操作, 而 NIO 基于 Channel(通道)和 Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中, 或者从缓冲区写入到通道中。 Selector(选择区)用于监听多个通道的事件(比如: 连接请求, 数据到达等) , 因此使用单个线程就可以监听多个客户端通道。Bio中的流是单向的,Nio中的通道是双向的。
举个例子:
无论在FileOutputStream、FileInputStream或者其他的InputStream、OutputStream想要读就是FileInputStream或者InputStream,想要写就是FileOutputStream、OutputStream;但是我们反观通道目前整体就是两个东西,一个ByteBuffer(字节缓冲区),另一个就是通道(Channel)只需要利用channel的read或者write方法,将ByteBuffer当作参数传入前面两个方法中就行了,一个通道就可以读有可以写。

文件相关功能:
写文件
通道和流作用是一样的,都是都或者写
无论读写,整体思想就是,首先我们先建一个流,其次通过流获取通道,然后初始化一个缓冲区,设置其大小,然后通过缓冲区的put方法将数据放进去,具体数据类型根据实际情况来判断。在这里有一个最重要的问题,就是byteBuffer.flip();这个方法是反转缓冲区,正常的情况,当将数据放入缓冲区之后,指针下标,会在数据最后一个字符下面停留着,,我们要是想写,必须反转缓冲区,经指针重新指向数据的0位下标,这样才能把数据写入指定文件中:
代码:
//建立流
FileOutputStream fileOutputStream = new FileOutputStream("base.txt");
//在流中得到一个通道
FileChannel channel =fileOutputStream.getChannel();
//提供一个缓冲去
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
//像缓冲区存入数据
byteBuffer.put("i am god,but i can't save myself!!!".getBytes());
byteBuffer.flip();
//将缓冲区放入通道
channel.write(byteBuffer);
//关闭流
fileOutputStream.close();
读文件的情况有点不同,首先不用反转缓冲区,其次调用的方法是read方法,最后,尽量获取数据的长度,看来限制缓冲区的长度。
读文件
代码:
//获取数据文件
File file = new File("base.txt");
//建立流
FileInputStream fileInputStream = new FileInputStream(file);
//在流中得到一个通道
FileChannel channel =fileInputStream.getChannel();
//提供一个缓冲去
ByteBuffer byteBuffer = ByteBuffer.allocate((int) file.length());
//将缓冲区放入通道
channel.read(byteBuffer);
//读取数据在这里源码上面获取的参数必须是数组
System.out.println(new String(byteBuffer.array()));
//关闭流
fileInputStream.close();
复制文件:
复制文件需要建立两个流,两个通道,两个方式如代码演示
//建立两个流
FileInputStream fileInputStream = new FileInputStream("base.txt");
FileOutputStream fileOutputStream = new FileOutputStream("D:\\ce\\base.txt");
//得到两个通道
FileChannel sourceChannel = fileInputStream.getChannel();
FileChannel destChannel = fileOutputStream.getChannel();
//开始复制(两种方式)
destChannel.transferFrom(sourceChannel,0,sourceChannel.size());
//sourceChannel.transferTo(0,destChannel.size(),destChannel);
//关闭两个流
fileInputStream.close();
fileOutputStream.close();

浙公网安备 33010602011771号