Java NIO 教程(二) Channel

参考:http://ifeve.com/channels/
原文地址

目录

  • Java NIO教程
  • Java NIO 教程(一) 概述
  • Java NIO 教程(二) Channel
  • Java NIO 教程(三) Buffer
  • Java NIO 教程(四) Scatter/Gather
  • Java NIO 教程(五) 通道之间的数据传输
  • Java NIO 教程(六) Selector
  • Java NIO 教程(七) FileChannel
  • Java NIO 教程(八) SocketChannel
  • Java NIO 教程(九) ServerSocketChannel
  • Java NIO 教程(十) 非阻塞式服务器
  • Java NIO 教程(十一) Java NIO DatagramChannel
  • Java NIO 教程(十二) Pipe
  • Java NIO 教程(十三) Java NIO vs. IO
  • Java NIO 教程(十四) Java NIO Path
  • Java NIO 教程(十五) Java NIO Files
  • Java NIO 教程(十六) Java NIO AsynchronousFileChannel

Java NIO的通道类似流,但又有些不同:

  • 既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。
  • 通道可以异步地读写。
  • 通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。

正如上面所说,从通道读取数据到缓冲区,从缓冲区写入数据到通道。如下图所示:

Java NIO 教程(二) Channel_第1张图片
NIO 数据读写流程

Channel的实现

这些是Java NIO中最重要的通道的实现:

FileChannel
DatagramChannel
SocketChannel
ServerSocketChannel

  • FileChannel 从文件中读写数据。
  • DatagramChannel 能通过UDP读写网络中的数据。
  • SocketChannel 能通过TCP读写网络中的数据。
  • ServerSocketChannel可以监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel

基本的 Channel 示例

下面是一个使用FileChannel读取数据到Buffer中的示例:

    private static void useNio(){
        RandomAccessFile aFile = null;
        try {
            aFile = new RandomAccessFile("/Users/sschen/Documents/SerialVersion.txt", "rw");
            FileChannel inChannel = aFile.getChannel();

            ByteBuffer byteBuffer = ByteBuffer.allocate(48);
            int byteReader = inChannel.read(byteBuffer);

            while (byteReader != -1) {
                System.out.println("Read:" + byteReader);
                byteBuffer.flip();

                while (byteBuffer.hasRemaining()) {
                    System.out.println((char)byteBuffer.get());
                }

                byteBuffer.clear();

                byteReader = inChannel.read(byteBuffer);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        finally {
            try {
                aFile.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

注意 buf.flip() 的调用,首先读取数据到Buffer,然后反转Buffer,接着再从Buffer中读取数据。下一节会深入讲解Buffer的更多细节。

你可能感兴趣的:(Java NIO 教程(二) Channel)