原有的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对文件进行读操作
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