好热闹

好热闹

bbbbb

二、NIO的基本开发方式

channel 简介#

  1. IO 通信的通道,类似于 InputStream、OutputStream
    1. Channel 没有方向性

image

  • 常见 Channel
  1. 文件操作
    FileChannel,读写文件中的数据。
  2. 网络操作
    SocketChannel,通过 TCP 读写网络中的数据。
    ServerSockectChannel,监听新进来的 TCP 连接,像 Web 服务器那样。对每一个新进来的连接都会创建一个 SocketChannel。
    DatagramChannel,通过 UDP 读写网络中的数据。
  • 获得 channel 的方式

    1. FileInputStreanm/FileOutputStream
      1. RandomAccessFile
    2. Socket
    3. ServerSocket
    4. DatagramSocket

    Buffer 简介#

  1. Channel 读取或者写入的数据,都要写到 Buffer 中,才可以被程序操作。
  2. 因为 Channel 没有方向性,所以 Buffer 为了区分读写,引入了读模式、写模式进行区分。

image

  • 常见 buffer
  1. ByteBuffer 常用
  2. CharBuffer
  3. DoubleBuffer
  4. FloatBuffer
  5. IntBuffer
  6. LongBuffer
  7. ShortBuffer
  8. MappedByteBuffer.. 常用
  • 获得 buffer 的方式
  1. ByteBuffer.allocate(10);
  2. encode()
package nio;

import java.io.FileInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * NIO channel 和 buffer 使用
 * **/
public class Main {
    public static void main(String[] args) throws IOException {

        // 1. 获取文件的channel
        FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Administrator\\IdeaProjects\\untitled\\1.txt");
        FileChannel channel = fileInputStream.getChannel();

        // 创建buffer
        ByteBuffer buffer = ByteBuffer.allocate(10);

       while(true){
           // 从channel中读取数据,buffer刚创建时为写模式,所以无需切换模式
           // channel.read 返回的int 如果是-1 代表没有数据了,相反则返回读取的字节数量
           int read = channel.read(buffer);

           // 返回为-1时,结束循环
           if (read == -1)break;


           // 设置为读模式
           buffer.flip();

           // 循环读取buffer中的数据,buffer.hasRemaining()可以判断buffer中是否还有数据
           while (buffer.hasRemaining()){
               byte b = buffer.get();
               System.out.println((char)b);
           }

           // 最后读完数据切换为写模式(在这个程序中不写也能运行,但读完切换模式是良好的编程习惯,日后会少遇到很多麻烦)
           buffer.clear();
       }

    }
}

NIO 开发的步骤总结#

  1. 获取 Channel
  2. 创建 Buffer
  3. channel.read (buffer); // 循环的从 Channel 中获取数据,读入到 Buffer 中。进行操作 。
    buffer.flip ();// 设置读模式
    buffer.get (); 循环从 buffer 中获取数据。
    buffer.clear ();// 设置写模式
Loading...
Ownership of this post data is guaranteed by blockchain and smart contracts to the creator alone.