java NIO
程序员文章站
2022-07-13 17:01:48
...
原有的I/O操作都是以字节为单位进行读写的,虽然应用时使用了很多高级流进行了封装,不需要直接去处理字节流,但是底层的实现还是离不开字节处理,原有的I/O操作是一次一个字节的处理数据,速度比较慢,此外InputStream中的read()是一种阻塞性的方法,该方法可用于从流中读取数据,但是如果数据源没有数据,它将一直等待,其它程序也不能执行。
为解决这一问题,从JDK1.4开始提供了一系列改进I/O处理的新特性,这些新特性被称为新I/O,简称NIO,它是基于原有I/O的改进和扩展。与原有I/O不同的是,它是基于特殊缓冲区快(Buffer)进行的高效I/O操作,NIO的缓冲区与普通的缓冲区不同,它是一块连续的空间,它内存的分配不是在java的堆栈中,不受java内存回收的影响,它的实现不是纯java的代码,而是本地代码,这样操作系统可以直接与缓冲区交互,java程序只需完成对缓冲区的读写,而后续操作由操作系统完成。
异步通道Channel是NIO另外一个重要的新特点,它不是对原有I/O类的扩展,而是完全崭新的实现,通过Channel,java应用程序能够更好地与操作系统的I/O服务结合起来,充分利用Buffer缓冲区,完成高性能的I/O操作,Channel的实现也不是纯java的,而是和操作系统紧密结合的本地代码。
当然NIO并不是对原有I/O的替代,尽管速度快,但是由于底层借助了大量的本地代码,对操作系统和硬件平台有很大的依赖性,这就影响了java的可移植性。
下面这个例子是通过NIO对文件进行读操作
注意,当使用NIO读写文件,首先还需要使用IO流类,当然不是所有的IO流类都支持NIO操作的,支持NIO操作的类有FileInputStream,FileOutputStream,RandomAccessFile
为解决这一问题,从JDK1.4开始提供了一系列改进I/O处理的新特性,这些新特性被称为新I/O,简称NIO,它是基于原有I/O的改进和扩展。与原有I/O不同的是,它是基于特殊缓冲区快(Buffer)进行的高效I/O操作,NIO的缓冲区与普通的缓冲区不同,它是一块连续的空间,它内存的分配不是在java的堆栈中,不受java内存回收的影响,它的实现不是纯java的代码,而是本地代码,这样操作系统可以直接与缓冲区交互,java程序只需完成对缓冲区的读写,而后续操作由操作系统完成。
异步通道Channel是NIO另外一个重要的新特点,它不是对原有I/O类的扩展,而是完全崭新的实现,通过Channel,java应用程序能够更好地与操作系统的I/O服务结合起来,充分利用Buffer缓冲区,完成高性能的I/O操作,Channel的实现也不是纯java的,而是和操作系统紧密结合的本地代码。
当然NIO并不是对原有I/O的替代,尽管速度快,但是由于底层借助了大量的本地代码,对操作系统和硬件平台有很大的依赖性,这就影响了java的可移植性。
下面这个例子是通过NIO对文件进行读操作
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; public class NIOTest { public static String fileReader(File fileName){ String fileContent = null; FileInputStream fis = null; FileChannel fc = null; try { fis = new FileInputStream(fileName); //创建ByteBuffer缓冲区,大小可根据情况指定 ByteBuffer bb = ByteBuffer.allocate(1024); //获取通道channel fc = fis.getChannel(); fc.read(bb); fileContent = new String(bb.array()); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ try { fc.close(); } catch (IOException e) { e.printStackTrace(); } try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } return fileContent; } public static void main(String[] args) { File file = new File("D:/a.txt"); String data = fileReader(file); System.out.println(data); } }
注意,当使用NIO读写文件,首先还需要使用IO流类,当然不是所有的IO流类都支持NIO操作的,支持NIO操作的类有FileInputStream,FileOutputStream,RandomAccessFile
上一篇: 利用NIO建立Socket服务器
下一篇: Java NIO实例诠释
推荐阅读
-
java怎么调用python代码(pycharm使用教程)
-
java实现多图片上传功能
-
Java多线程ThreadAPI详细介绍
-
设置和获取当前线程名称(java代码大全及详解)
-
Java Web开发过程中登陆模块的验证码的实现方式总结
-
java的substring方法(substring截取字符串用法)
-
myeclipse汉化教程(myeclipse运行java程序教程)
-
Java中数组与集合的相互转换实现解析
-
javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate DH keypair 解决方法总结
-
Java基础之异常处理操作示例