java NIO_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > java NIO

java NIO

 2011/9/27 7:35:14  liaokang.java  http://liaokang-java.iteye.com  我要评论(0)
  • 摘要:原有的I/O操作都是以字节为单位进行读写的,虽然应用时使用了很多高级流进行了封装,不需要直接去处理字节流,但是底层的实现还是离不开字节处理,原有的I/O操作是一次一个字节的处理数据,速度比较慢,此外InputStream中的read()是一种阻塞性的方法,该方法可用于从流中读取数据,但是如果数据源没有数据,它将一直等待,其它程序也不能执行。为解决这一问题,从JDK1.4开始提供了一系列改进I/O处理的新特性,这些新特性被称为新I/O,简称NIO,它是基于原有I/O的改进和扩展
  • 标签:Java
    原有的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
发表评论
用户名: 匿名