Java NIO 系列—Java NIO 与 IO

Nio 是java New IO的简称,在jdk1.4里提供的新api。Sun 官方标榜的特性如下:
1. 为所有的原始类型提供(Buffer)缓存支持。
2. 字符集编码解码解决方案
3. channel : 一个新的原始I/O 抽象。
4. 支持锁和内存映射文件的文件访问接口。
5. 提供多路(non-bloking)非阻塞式的高伸缩性网络I/O。
NIO创建目的是为了让java程序员可以实现高速I/O而无需编写自定义的本机代码。NIO 将最耗时的I/O 操作(即填充和提取缓冲区)转移回操作系统,因而可以极大地提高速度。
在了解两者区别之前,先了解I/O的概念。
I : 就是从硬盘到内存
O:就是从内存到硬盘

阻塞与非阻塞I/O

第一种方式:从硬盘读取数据,然后程序一直等,数据读完后,继续操作,这种方式也叫阻塞IO。第二种方式:从硬盘读取数据,然后程序继续向下执行,等数据读取完后,通知当前程勋(对硬件来说中断,对程序来说叫回调)然后此程序可以立即处理数据,也可以执行完当前操作在读取数据。

流与块的比较

Java NIO 和IO之间最大的区别是,IO是面向流的,NIO是面向缓冲区的。面向流意味着系统一次一个字节地处理数据。直到读取所有的字节,没有被缓存在任何地方。一个输入流产生一个字节的数据,一个输出流消费一个字节的数据。面向块的I/O是指每一个操作到在一步中产生或者消费一个数据块。

选择器

Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后选择一个单独的选择器来选择“通道”:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。

实例演示:

public class BufferedReaderDemo {

    public static void main(String[] args) throws IOException {
        String line = null; 
        try {
            FileReader in = new FileReader("C://Users//Tony//Desktop//文件流.txt");
            BufferedReader byReader = new BufferedReader(in);
            //一次读一行,读入null时文件结束
            while ((line = byReader.readLine())!=null) {
                System.out.println(line);
            }
            byReader.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

输出结果:
Name: Anna
Age: 25
Email: [email protected]
Phone: 1234567890
readLine()读取文件,以行为单位,一次读一行,一直读到null时结束,每读一行都显示行号

public class FileChannelDemo {

    public static void fileChannelDemo() throws IOException{
        //定义缓冲区对象
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        // 通过文件输入流获得文件通道对象(读取操作),获取输入输出通道
        FileChannel inFc = new FileInputStream("C://Users//Tony//Desktop//文件流.txt").getChannel();  
        //追加写入文件
        FileChannel outFcChannel = new FileOutputStream("C://Users//Tony//Desktop//文件流.txt",true).getChannel();  //
        //读取数据,clear()用来初始化缓存空间,使它可以接受读入的数据  
        buffer.clear();
        int len = inFc.read(buffer); // 从输入通道中将数据读到缓冲区  
        System.out.println(new String (buffer.array(),0,len));

        //写数据
        ByteBuffer buffer2 = ByteBuffer.wrap("oh my god!".getBytes());
        outFcChannel.write(buffer2);
    }

    public static void main(String[] args) throws IOException {
        fileChannelDemo();
    }
}

猜你喜欢

转载自blog.csdn.net/huo_yun/article/details/74162751