NIO buffer和channel

1:buffer类没有提供构造器,通过如下的方法来得到一个Buffer对象:static XxxBuffer allocate(int capcacity)

2:所有的Channel都不应该通过构造器来直接创建,而是通过传统的节点InputStream、OutputStream等的getChannel()方法来返回对应的Channel,不同的节点流获得的Channel不一样。程序不能直接和访问Channel中的数据,包括读取、写入都不行,Channel只能与Buffer进行交互。也就是说,如果要从Channel中获取数据,必须首先将Channel中的一些数据read到Buffer中,然后让程序从Buffer中get出这些数据;如果将程序中的数据写入Channel,一样先让程序将数据put入Buffer中,程序再将Buffer里的数据写入Channel中。

Channel中最常用的三类方法map()、read()、write()。其中map()方法用于将Channel对应的部分或全部数据映射成ByteBuffer;而read()用于从channel中读取数据到buffer中。write()方法向Buffer中写入数据。

读入: 

package com.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.text.MessageFormat;

public class TestFileChannel {
    public static void main(String[] args) throws IOException {


        FileInputStream fin = new FileInputStream("D:\\temp\\TestService.cs");

        // 获取通道
        FileChannel fc = fin.getChannel();

        // 创建缓冲区
        ByteBuffer buffer = ByteBuffer.allocate(1024);

        // 读取数据到缓冲区
        fc.read(buffer);

        buffer.flip();

        StringBuffer s=new StringBuffer();
        while (buffer.remaining() > 0) {
            byte b = buffer.get();
            s.append((char)b);
            //System.out.print(((char) b));
        }
        System.out.print(s);

        fin.close();


    }
}

写出:

package NIO;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * @ClassName ChannelTest
 * @Description TODO
 * @Author Kikityer
 * @Date 2018/10/18 16:13
 * @Version 1.0.0
 **/
public class ChannelTest {
    public static void main(String[] args) throws IOException {

        File file = new File("E://data.txt");
        FileOutputStream outputStream = new FileOutputStream(file);//io中流节点
        FileChannel channel = outputStream.getChannel(); //通过流节点getChannel方法创建输出管道
        ByteBuffer buffer = ByteBuffer.allocate(1024);  //创建一个容量为1024字节的buffer
        String string = "java nio";
        buffer.put(string.getBytes()); //先将需要的输出字符串的put到buffer中
        buffer.flip();     //此处必须要调用buffer的flip方法 对于buffer而言此时写转读
        channel.write(buffer);//将buffer的数据写到channel中
        channel.close();
        outputStream.close();
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_40581455/article/details/83146178