美文网首页
9.java.IO和java.NIO

9.java.IO和java.NIO

作者: 未知的证明 | 来源:发表于2019-03-01 15:26 被阅读0次

java.io中最核心的概念是流(Stream),面向流的编程。Java中要么就是输入流要不就是输出流,不可能两者都是。
Java.nio中有3个核心概念:Selector,Channel与Buffer。在Java点Nio中面向块(block)或者缓冲区编程的。Buffer本身是一块内存,底层实现上就是一个数组,数据的读写都是通过Buffer实现的。数据来自于Channel;数据从从Channel中读到Buffer中;不可能从Channel直接读到程序中,必须从Buffer中获得。在Nio中Buffer不仅可以读,还可以写,这种状态的实现是通过一个方法实现,Buffer中的flip(),可以转化读写方式,表示状态的反转,修改状态。
除了数组之外,buffer还提供了数据的结构化的访问方式,并且还可以追踪到系统的读写过程。

Java中的8中原生数据类型,都有各自的Buffer类型,如IntBuffer,LongBuffer,ByteBuffer以及CharBuffer等等。

Channel指的可以向其写入数据或者读取数据的对象,有点类似于java.io的Stream。所有的数据都是通过Buffer进行的,永远不会出现向Channel写入数据或者读取数据的情况。
与Stream不同的是,Channel是双向的,一个流只可能是InputSteam或者OutputSteam,Channel打开后则可以进行读取,写入或者是读写。
由于Channel是双向的,所以他能更好的发映出操作系统的真实情况;在Linux系统中,底层操作系统的通道就是双向的。

程序1

package com.liyuanfeng.nio;
import java.nio.IntBuffer;
import java.security.SecureRandom;
public class NioTest1 {
    public static void main(String[] args) {
        IntBuffer buffer = IntBuffer.allocate(10);
        for (int i = 0; i < buffer.capacity(); i++) {
            int randomNum = new SecureRandom().nextInt(20);
            buffer.put(randomNum);
        }
        buffer.flip();
        while (buffer.hasRemaining()) {
            System.out.println(buffer.get());
        }
    }
}

程序2

package com.liyuanfeng.nio;
import java.io.FileInputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class NioTest2 {
    public static void main(String[] args) throws Exception {
        FileInputStream fileInputStream = new FileInputStream("NioTest2.txt");
        FileChannel fileChannel = fileInputStream.getChannel();
        ByteBuffer byteBuffer = ByteBuffer.allocate(512);
        fileChannel.read(byteBuffer);
        byteBuffer.flip();
        while (byteBuffer.remaining()>0){
            byte b = byteBuffer.get();
            System.out.println("Character:"+(char)b);
        }
        fileInputStream.close();
    }
}

程序3

package com.liyuanfeng.nio;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class NioTest3 {
    public static void main(String[] args) throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream("NioTest3.txt");
        FileChannel fileOutputStreamChannel = fileOutputStream.getChannel();
        ByteBuffer allocate = ByteBuffer.allocate(512);
        String hello = "Hello World !世界你好!";
        byte[] bytes = hello.getBytes();
        for (byte aByte : bytes) {
            allocate.put(aByte);
        }
        allocate.flip();
        fileOutputStreamChannel.write(allocate);
        fileOutputStream.close();
    }

}

相关文章

  • 9.java.IO和java.NIO

    java.io中最核心的概念是流(Stream),面向流的编程。Java中要么就是输入流要不就是输出流,不可能两者...

  • 3. NIO Buffer

    以 Buffer 类开始我们对 java.nio 软件包的浏览历程。这些类是 java.nio 的构造基础。在本章...

  • 「高并发通信框架Netty4 源码解读(三)」NIO缓冲区Buf

    我们以 Buffer 类开始我们对 java.nio 软件包的浏览历程。这些类是 java.nio 的构基础。我们...

  • java NIO之缓冲区篇(一)

    我们以Buffer类开始我们对java.nio软件包的浏览历程,这些类是java.nio的构造基础。一个Buffe...

  • okio 的使用及源码分析

    简介 okio 补充了 java.io 和 java.nio 的内容,使得数据访问、存储和处理更加便捷。本文将简单...

  • IO与NIO

    java.io和java.nio 1、java.io中最为和兴的一个概念是流(Stream),面向流的编程。jav...

  • 4、java.nio、ServerSocketChannel

    客户端参考:https://www.jianshu.com/p/027af54275f3

  • Okio源码分析

    1 概述 Okio是一个对java.io和java.nio进行补充的库,使数据访问,保存和处理变得更容易。 Oki...

  • Okio

    1.简介   Okio是由square公司开发的,它补充了java.io和java.nio的不足,以便能够更加方便...

  • Java IO介绍

    Java IO介绍 Java IO主要是指的是java.io和java.nio两个包下提供的对IO操作的功能(由于...

网友评论

      本文标题:9.java.IO和java.NIO

      本文链接:https://www.haomeiwen.com/subject/porduqtx.html