Java中的NIO

来源:互联网 发布:ubuntu怎么安装lrzsz 编辑:程序博客网 时间:2024/06/03 14:51
Java中的NIONIO(New I/O):1)说明:jdk1.4中提供了NIO2)特点:面向块的、高速的I/O3)IO与NIO的比较:1)IO以流(逐字节)的方式处理数据,NIO以块的方式处理数据。2)IO将数据直接写出到Stream中或从Stream中直接读取数据;NIO中所有的数据必须通过缓冲区来处理。4)核心API:缓冲区:java.nio.Buffer1)缓冲区从两个方面来提高I/O的效率:1>减少实际的物理读写次数2>缓冲区所占的内存空间一直在被复用,减少了动态分配内存及GC的次数。2)缓冲区是一个数组,java.nio.ByteBuffer是最常见的缓冲区。1>BtyeBuffer提供了两个创建字节缓冲区的方法:allocate()、directAllocate()2>directAllocate()方法创建的缓冲区称为直接缓冲区,直接缓冲区与当前的操作系统能够更好地耦合,可以进一步提高I/O的速度。注:分配直接缓冲区的开销比较大,因此只有在缓冲区较大并且需要长期存在时,才会使用直接缓冲区。通道:Channel1)NIO中通道的作用和IO中流的作用相似,都是用来传输数据的。注意:IO中的流是单向的,而NIO中的通道是双向的。2)NIO中所有的数据都是通过缓冲区来处理的,通道就是用来连接缓冲区和数据源的:输入流:将数据从通道读入到缓冲区中,然后再从缓冲区中获取数据。输出流:将数据写入缓冲区中,然后再把缓冲区中的数据输出到通道中。5)例子:File src = new File("D:\\test.txt");File dest = new File("D:\\test\\testCopy.txt");// 获取源文件和目标文件的输入输出流FileInputStream fIn = new FileInputStream(src);FileOutputStream fOut = new FileOutputStream(dest);FileChannel fcIn = fIn.getChannel();// 获取文件输入流对应的文件通道FileChannel fcOut = fOut.getChannel();// 获取文件输出流对应的文件通道// 创建一个字节缓冲区ByteBuffer buffer = ByteBuffer.allocate(1024);while (true) {// 重设缓冲区,使缓冲区可以接受读入的数据,将数据从通道读入到缓冲区前调用该方法buffer.clear();// 把数据从(输入)通道读入到buffer中,返回读取的字节数int count = fcIn.read(buffer);if (count == -1) {break;}// 将缓冲区反转:让缓冲区可以将刚刚读入的数据,写入到另一个通道中buffer.flip();// 将数据写入到buffer中fcOut.write(buffer);fcIn.close();fcOut.close();fIn.close();fOut.close();}

0 0
原创粉丝点击