NIO基础介绍(一)

(1)Java.io中最为核心的一个概念是流(stream),面向流的编程。流是信息的载体。Java中一个流要么是输入流,要么是输出流,不可能同时既是输入流又是输出流。

(2)Java.nio中拥有3个核心概念:selector,channel,buffer。在java.nio中是面向块(block)或是缓冲区(buffer)编程的。Buffer本身就是一块内存,底层实现上,它实际上是个数组。数据的读、写都是通过Buffer来实现的(既能读又能写)。除了数组之外,Buffer还提供了对于数据的结构化访问方式,并且可以追踪到系统的读写过程。

(3)Java中的7个原生数据类型都有各自对应的Buffer类型,如IntBuffer,LongBuffer,ByteBuffer等,没有BooleanBuffer类型。

(4)Channel指的是可以向其写入数据或从中读取数据的对象,它类似于java.io中的Stream。所有数据的读写都是通过Buffer来进行的,永远不会出现直接channel写入数据的情况,或是直接从Channel读取数据的情况。不同的是,java.io中的一个流只能是OutputStream或是InputStream。由于Channel是双向的,因此它能更好地反映出底层操作系统的真实情况:在linux系统中,底层操作系统的通道就是双向的。

public class nioTest1 {//随机数输出
    public static void main(String[] args) {
        IntBuffer buffer = IntBuffer.allocate(10);
        for(int i = 0; i<buffer.capacity();++i){
            int randomNumber = new SecureRandom().nextInt(20);
            buffer.put(randomNumber);
        }
        buffer.flip();//翻转;实现读写的切换
        while(buffer.hasRemaining()){
            System.out.println(buffer.get());
        }
    }
}


//操作文件
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);//读取输入流数据到buffer中
        byteBuffer.flip();

        while(byteBuffer.remaining() > 0){
            byte b = byteBuffer.get();
            System.out.println("Character: " + (char)b);
        }

        fileInputStream.close();

    }
    @Test
    public void TestOutputNio() throws Exception {
        FileOutputStream fileOutputStream = new FileOutputStream("nioOutput.txt");
        FileChannel fileChannel = fileOutputStream.getChannel();
        ByteBuffer byteBuffer = ByteBuffer.allocate(512);
        byte[] message = "Hello world".getBytes();//要写的信息定义到数组中

        for(int i = 0; i<message.length;++i){
            byteBuffer.put(message[i]);//信息给到buffer
        }
        byteBuffer.flip();
        fileChannel.write(byteBuffer);//将buffer中数据写到channel
        fileOutputStream.close();

    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值