Java NIO入門ガイド

2284 ワード

前言
このブログでは、NIOの原理実装と基本的なワークフローについて簡単に説明します.
I/OとNIOの本質的な違い
NIOはバッファの充填と抽出のI/O動作をオペレーティングシステムに移行した
I/Oはストリームでデータを処理し、NIOはバッファでデータを処理する.IOはブロックされ、NIOは非ブロックされ、データが読み込まれたり、データが完全に書き込まれたりするまで、IOスレッドは動作を開始しますが、NIOはどのような状況でも非ブロックです.
チャネルとバッファ
NIOの3つのコアオブジェクト:チャネル(Channel)、バッファ(Buffer)、セレクタ(Selector)
バッファはデータのみを一時的に格納し、チャネルは読み取りと書き込み操作に用いられ、IOストリームに相当し、IOストリームとは異なりチャネルは双方向である.
NIO動作では,チャネルから読み出されたデータはバッファに先に置かなければならず,チャネルに送られたデータもバッファに先に置かなければならない.
NIOチャネル
≪チャネル|Channel|emdw≫:チャネルはオブジェクトであり、データの読み取りと書き込みが可能であり、元のI/Oパケット内のストリームのシミュレーションと理解できます.
チャネルとストリームの違いは、チャネルが双方向であることです.チャネルは、読み書き、または同時に読み書きに使用できますが、ストリームは1つの方向しかありません.すなわち、1つのストリームはInputStreamのサブクラスまたはOutputStreamのサブクラスでなければなりません.
  • FileChannel:ファイルからデータを読み書きします.
  • DatagramChannel:UDPでネットワーク内のデータを読み書きできます.
  • SocketChannel:TCPを通じてネットの中のデータを読み書きすることができます.
  • ServerSocketChannel:Webサーバのように、新しく入ってきたTCP接続を傍受できます.新しい接続ごとにSocke Channelが作成されます.

  • NIOバッファ
    ≪バッファ|Buffer|emdw≫:バッファは実質的に配列です.最も一般的なバッファタイプはByteBufferで、Javaの基本タイプに対応するバッファがあります.
    バッファタイプ:
  • ByteBuffer
  • CharBuffer
  • ShortBuffer
  • IntBuffer
  • LongBuffer
  • FloatBuffer
  • DoubleBuffer

  • NIOセレクタ
    セレクタ(Selector):セレクタは、複数のチャネルのイベントをリスニングするために使用されます.Selectorでは、単一スレッドで複数のチャネルを処理できます.すなわち,複数のチャネルを登録し,同じセレクタを用いて1つのスレッドを開くだけで実行できる.
    NIO読み書き操作
    NIO読み出しプロセス:まずバッファを作成し、チャネル読み出しデータをこのバッファに配置します.
    graph LR
    
    Channel-->Buffer
    

    NIO書き込みプロセス:まずバッファを作成し、データが格納されている場合は、これらのデータをパイプに送って書き込みを行います
    graph LR
    Buffer-->Channel
    

    ファイル読み込み操作ファイル読み込みプロセス:FileInputStreamからChannelを取得し、Bufferを作成し、ChannelからBufferにデータを読み込む
    // FileInputStream    
    FileInputStream fis = new FileInputStream( "readandshow.txt" );
    FileChannel fc = fis.getChannel();
    //     
    ByteBuffer buffer = ByteBuffer.allocate( 1024 );
    //           
    fc.read( buffer );
    

    ファイル書き込みプロセス
    FileOutputStream fout=new FileOutputStream("write.txt");
    FileChannel fc=fout.getChannel();
    ByteBuffer buffer=ByteBuffer.allocate(1024);
    for (int i=0; i

    付録:NIO入門NIOシリーズチュートリアル